flutter - 与嵌套导航器和 BottomNavigationBar 一起使用时,PageStorage 不会保持滚动位置
问题描述
我正在尝试在 BottomNavigationBar 的每个选项卡下使用单独的导航PageStorageBucket
器PageStorage
。PageStorageKey
当我切换标签时,它不会保留滚动位置。
如果我从树中删除 Navigator 小部件而不是直接使用页面,它会按预期工作。每个选项卡都会记住它们的滚动位置。
请帮助我使用 Navigator 小部件或 PageStore 对象的方式有什么问题?
class MyTabPage extends StatefulWidget {
ViewModel viewModel;
RouteProvider routeProvider;
MyTabPage({
final Key key,
final RouteProvider routeProvider,
@required final this.viewModel})
: assert(viewModel != null),
assert(routeProvider != null),
super(key: key);
@override
_MyTabPageState createState() => _MyTabPageState();
}
class _MyTabPageState extends State<MyTabPage> {
List<MyTabNavigator> myPageTabNavigators;
final PageStorageBucket pageStorageBucket = PageStorageBucket();
@override
void initState() {
myPageTabNavigators = _tabItems.map((item) =>
_tabNavigator(item, PageStorageKey("TNTNTN" + item.title)).toList(growable: false);
super.initState();
}
@override
Widget build(final BuildContext context) {
return StreamBuilder(
stream: viewModel.selectedItemStream,
initialData: widget.viewModel.items.first,
builder: (final context, final snapshot) {
final myPageTabItem selectedItem = snapshot.data as myPageTabItem;
return WillPopScope(
child: Scaffold(
body: PageStorage(
bucket: pageStorageBucket,
child: myPageTabNavigators[widget.viewModel.items.indexOf(selectedItem)]
),
bottomNavigationBar: MyPageNavigationBar(
selectedTabItem: selectedItem
),
)
);
});
}
MyTabNavigator _tabNavigator(final MyTabItem myTabItem, Key key) {
return MyTabNavigator(
key: key,
myTabItem: myTabItem,
routeProvider: this.widget.routeProvider
);
}
}
class MyTabNavigator extends StatefulWidget {
final MyTabItem tabItem;
final RouteProvider routeProvider;
MyTabNavigator({
Key key,
@required final this.myTabItem,
@required final this.routeProvider})
: assert(myTabItem != null),
assert(routeProvider != null),
super(key: key);
@override
_MyTabNavigatorState createState() => _MyTabNavigatorState();
}
class _MyTabNavigatorState extends State<MyTabNavigator> {
@override
Widget build(final BuildContext context) {
String initialRoute = widget.myTabItem.initialRoute;
// return widget.routeProvider.applicationRoutes[initialRoute](context); ==> this works, but below line does not work
return Navigator(
key: widget.key,
initialRoute: initialRoute,
onGenerateRoute: _onGenerateRoute
);
}
Route<dynamic> _onGenerateRoute(final RouteSettings routeSettings) {
return MaterialPageRoute(
builder: (context) {
return widget.routeProvider.applicationRoutes[routeSettings.name](context);
},
settings: routeSettings
);
}
}
解决方案
推荐阅读
- c++ - 将指向数组的指针作为函数参数传递,它本身是另一个函数的返回值?
- mysql - 用于从多个表中选择数据的 SQL 查询
- python - Django - 创建一个没有请求处理扩展的主页(不直接到模板)
- ansible - ansible 语法错误 - yaml - ansible-galaxy 角色
- javascript - 在所有回调完成后,如何在提交事件的最后调用函数?
- kubernetes - Kubernetes 在所有集群中更改 kubelet 配置
- java - 如何使 TreeTableView 列中的文本居中?
- php - Laravel 登录和注册在本地工作,但部署到网络后不起作用
- python - 将列表输出为 .csv 文件
- python - CondaHTTPError:URL 的 HTTP 000 连接失败