【发布时间】:2025-12-12 20:50:02
【问题描述】:
在我的 Flutter 应用程序中,存在底部导航栏,并且有两个底部导航栏项。我在两个屏幕上都使用列表视图。当我在该屏幕上滚动后从一个屏幕导航到另一个屏幕时。我回到了列表的顶部,而不是我离开的最后一个位置。如何在两个屏幕上进行持久化?
【问题讨论】:
标签: flutter navigation persistence bottomnavigationview
在我的 Flutter 应用程序中,存在底部导航栏,并且有两个底部导航栏项。我在两个屏幕上都使用列表视图。当我在该屏幕上滚动后从一个屏幕导航到另一个屏幕时。我回到了列表的顶部,而不是我离开的最后一个位置。如何在两个屏幕上进行持久化?
【问题讨论】:
标签: flutter navigation persistence bottomnavigationview
您可以将 keepScrollOffset 设置为 true.. https://api.flutter.dev/flutter/widgets/ScrollController-class.html
【讨论】:
您可以使用PageStorage 和PageBucket 来保存ListView 的滚动偏移量。
工作示例是https://codepen.io/ntaoo/pen/LYpyrZJ。
主要部分如下,
final bucket = PageStorageBucket();
_widgetOptions = <Widget>[
PageStorage(
bucket: bucket,
child: ListView(
key: PageStorageKey<String>('0'),
children: <Widget>[
Text(
'Index 0: Home Start\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n to... \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEnd',
style: optionStyle,
),
],
),
),
PageStorage(
bucket: bucket,
child: ListView(
key: PageStorageKey<String>('1'),
children: <Widget>[
Text(
'Index 1: Business Start\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n to... \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEnd',
style: optionStyle,
),
],
),
),
PageStorage(
bucket: bucket,
child: ListView(
key: PageStorageKey<String>('2'),
children: <Widget>[
Text(
'Index 2: School Start\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n to... \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nEnd',
style: optionStyle,
),
],
),
),
];
ScrollController测试代码是keepScrollOffset'的完美使用示例。
【讨论】:
您可以使用PageStorageKey:
@override
Widget build(BuildContext context) {
return ListView.builder(
key: new PageStorageKey('key_name'),
itemBuilder: ...
);
}
【讨论】: