【发布时间】:2019-10-29 22:43:17
【问题描述】:
我有一个像这样的底部导航栏:
Scaffold navBarPages() {
return Scaffold(
key: _scaffoldKey,
body: PageView(
children: <Widget>[
//Sends current user to pages.
PageOne(),
PageTwo(),
PageThree(),
PageFour(),
PageFive(),
],
controller: pageController,
onPageChanged: onPageChanged,
physics: NeverScrollableScrollPhysics(),
),
bottomNavigationBar: CupertinoTabBar(
currentIndex: pageIndex,
onTap: onTap,
activeColor: Theme.of(context).primaryColor,
items: [
BottomNavigationBarItem()
...
],
),
);
}
在 PageFive() 上,我正在执行一个按下按钮的操作,我想将屏幕弹出到 PageOne()。 Navigator.pop(context) 返回 PageFive(),关闭有按钮的屏幕。
我尝试在主服务器上使用路由,然后推送到“/pageOne”namedRoute。但是随后 pageOne 没有与 BottomNavBar 一起出现,并且我要关闭的屏幕仍在小部件树中。我想完全弹出它,有点将用户重定向到第一页。
更新: 将 pushAndRemove 与路由一起使用:
Navigator.of(context).pushNamedAndRemoveUntil(
'/pageOne', (Route<dynamic> route) => false);
我遇到的路线问题是,在推送后,BottomNavBar 不会显示。但为了解决它,我改变了
routes: {'/pageOne': (context) => PageOne()}
到
routes: {'/home': (context) => Home()}
Home 包含 BottomNavBar 类,因此它可以“重新加载”应用程序,将用户重定向到第一页。
【问题讨论】:
-
更常规的方法是在单击按钮后更改 pageIndex 变量。这不适合您吗?
-
我必须使用回调从另一个类访问 pageIndex 对吗?这可能是一个问题,因为具有按钮的页面不是 BottomNavBar 的子页面。有没有办法改变它?
-
我会采用的方法是通过状态管理方法,例如 ChangeNotifierProvider 或 ScopedModel。状态管理基本上就是您使用的,当您想在您的小部件中使用变量时,不需要将它传递到一些小部件层次结构中。你可以在这里flutter.dev/docs/development/data-and-backend/state-mgmt/simple和pub.dev/packages/scoped_model阅读更多信息。
标签: flutter dart routes navigationbar