Flutter 如何在颤振中进行嵌套导航

Flutter 如何在颤振中进行嵌套导航,flutter,flutter-navigation,Flutter,Flutter Navigation,有人对在颤振中进行嵌套导航有什么建议吗 我想要的是保持一个持久的底部导航栏,即使在重定向到新屏幕时也是如此。与YouTube类似,在YouTube上,即使你浏览菜单的更深一层,底部的栏也总是在那里 我无法从文件中找到答案 到目前为止,我能找到的唯一一个深入到我的需求的教程是。然而,这非常令人困惑 现在我正在使用 Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {

有人对在颤振中进行嵌套导航有什么建议吗

我想要的是保持一个持久的底部导航栏,即使在重定向到新屏幕时也是如此。与YouTube类似,在YouTube上,即使你浏览菜单的更深一层,底部的栏也总是在那里

我无法从文件中找到答案

到目前为止,我能找到的唯一一个深入到我的需求的教程是。然而,这非常令人困惑

现在我正在使用

Navigator.push(context,
                MaterialPageRoute(builder: (BuildContext context) {
              return Container()
然而,它只是将新的小部件推到整个堆栈上,覆盖底部导航栏


任何提示都将不胜感激

以下是作为启动程序的persistent BottomNavigationBar的示例代码:

导入“包装:颤振/材料.省道”;
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:主页(),
);
}
}
类MainPage扩展了无状态小部件{
最终navigatorKey=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:专栏(
儿童:[
扩大(
孩子:领航员(
关键:导航工作,
OnGeneratorOute:(路线)=>物料管理路线(
设置:路线,
生成器:(上下文)=>PageOne(),
),
),
),
底部导航栏(导航工作)
],
),
);
}
}
类BottomNavigationBar扩展了无状态小部件{
最后的环球航行;
BottomNavigationBar(this.navigatorKey):断言(navigatorKey!=null);
未来推送(路线){
返回navigatorKey.currentState.push(路由);
}
@凌驾
小部件构建(构建上下文){
返回容器(
颜色:颜色,蓝色,
孩子:巴顿巴(
对齐:MainAxisAlignment.space,
儿童:[
升起的按钮(
子项:文本(“第一页”),
已按下:(){
push(MaterialPageRoute(builder:(context)=>PageOne());
},
),
升起的按钮(
子:文本(“第二页”),
已按下:(){
push(MaterialPageRoute(builder:(context)=>PageTwo());
},
)
],
),
);
}
}
类PageOne扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回容器(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(“第一页”),
升起的按钮(
已按下:(){
Navigator.of(context.pop();
},
子:文本(“Pop”),
),
],
),
);
}
}
类PageTwo扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回容器(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(“第二页”),
升起的按钮(
已按下:(){
Navigator.of(context.pop();
},
子:文本(“Pop”),
),
],
),
);
}
}
下面是屏幕记录的显示方式


这里有一个简单的示例,它甚至支持使用选项卡栏弹出第一个屏幕

导入“包装:颤振/材料.省道”;
导入“../library/screen.dart”;
导入“../playlists/screen.dart”;
导入“../search/screen.dart”;
导入“../settings/screen.dart”;
类TabsScreen扩展StatefulWidget{
@凌驾
_TabsScreenState createState()=>\u TabsScreenState();
}
类_TabsScreenState扩展状态{
int _currentIndex=0;
最终的_libraryScreen=GlobalKey();
最终_playliscreen=GlobalKey();
最终_searchScreen=GlobalKey();
最终设置屏幕=GlobalKey();
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:IndexedStack(
索引:_currentIndex,
儿童:[
领航员(
键:_libraryScreen,
OnGeneratorOute:(路线)=>物料管理路线(
设置:路线,
生成器:(上下文)=>LibraryScreen(),
),
),
领航员(
键:_播放列表屏幕,
OnGeneratorOute:(路线)=>物料管理路线(
设置:路线,
生成器:(上下文)=>播放列表屏幕(),
),
),
领航员(
键:\ u搜索屏幕,
OnGeneratorOute:(路线)=>物料管理路线(
设置:路线,
生成器:(上下文)=>SearchScreen(),
),
),
领航员(
键:_设置屏幕,
OnGeneratorOute:(路线)=>物料管理路线(
设置:路线,
生成器:(上下文)=>SettingsScreen(),
),
),
],
),
底部导航栏:底部导航栏(
类型:BottomNavigationBarType.fixed,
currentIndex:_currentIndex,
onTap:(val)=>\u onTap(val,上下文),
背景颜色:主题。背景。脚手架背景颜色,
项目:[
底部导航气压计(
图标:图标(图标、图书馆和书籍),
标题:文本(“库”),
),
底部导航气压计(
图标:图标(Icons.list),
标题:文本(“播放列表”),
),
底部导航气压计(
图标:图标(Icons.search),
标题:文本(“搜索”),
),
底部导航气压计(
图标:图标(图标.设置),
标题:文本(“设置”),
),
],
),
);
}
void\u onTap(int val,BuildContext){
如果(_currentIndex==val){
开关(val){
案例0:
_libraryScreen.currentState.popUntil((route)=>route.isFirst);
打破
案例1:
_playliscreen.currentState.popUnt