在我的 Flutter 项目中,我使用
ListWheelScrollView
在页面之间滑动。
我从页面导航到横向屏幕。
但是当我弹出来时,页码有时是错误的。
void main(List<String> args) {
runApp(_Test());
}
class _Test extends StatelessWidget {
const _Test({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: LayoutBuilder(
builder: (context, constraints) {
return RotatedBox(
quarterTurns: -1,
child: ListWheelScrollView.useDelegate(
itemExtent: constraints.maxWidth,
physics: PageScrollPhysics(),
perspective: 0.002,
childDelegate: ListWheelChildLoopingListDelegate(
children: List.generate(8, (index) {
return RotatedBox(
quarterTurns: 1,
child: GestureDetector(
child: Container(
alignment: Alignment.center,
color: Colors.primaries[index].shade200,
child: Text('<- Push $index ->'),
),
onTap: () async {
await SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
await Navigator.push(context, MaterialPageRoute(builder: (context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: FilledButton(
child: Text('Pop $index'),
onPressed: () => Navigator.pop(context),
),
),
);
}));
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
},
),
);
}),
),
),
);
},
),
),
);
}
}
当我看到你的代码时,我建议你在进入另一个屏幕之前保存当前索引,并在返回后恢复它。这是我的代码,它对我有用,如果您遇到任何错误,请告诉我。
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main(List<String> args) {
runApp(const _Test());
}
class _Test extends StatefulWidget {
const _Test({super.key});
@override
State<_Test> createState() => _TestState();
}
class _TestState extends State<_Test> {
int currentIndex = 0;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: LayoutBuilder(
builder: (context, constraints) {
return RotatedBox(
quarterTurns: -1,
child: ListWheelScrollView.useDelegate(
itemExtent: constraints.maxWidth,
physics: const PageScrollPhysics(),
perspective: 0.002,
childDelegate: ListWheelChildLoopingListDelegate(
children: List.generate(8, (index) {
return RotatedBox(
quarterTurns: 1,
child: GestureDetector(
child: Container(
alignment: Alignment.center,
color: Colors.primaries[index].shade200,
child: Text('<- Push $index ->'),
),
onTap: () async {
setState(() {
currentIndex = index;
});
await SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
await Navigator.push(context, MaterialPageRoute(builder: (context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: FilledButton(
child: Text('Pop $index'),
onPressed: () => Navigator.pop(context),
),
),
);
}));
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
// Restore the scroll position
(context.findAncestorStateOfType<_TestState>()?.context
.findRenderObject() as RenderObject)
.markNeedsLayout();
},
),
);
})),
),
),
);
},
),
),
);
}
}