如何使用多个导航器
Posted
技术标签:
【中文标题】如何使用多个导航器【英文标题】:How to use multiple navigators 【发布时间】:2018-03-12 04:20:38 【问题描述】:我目前在我的颤振应用程序中有一个MaterialApp
,这使得Navigator
的使用变得非常容易,这很棒。但是,我现在正试图弄清楚如何为特定视图/小部件创建更多导航器。例如,我有一个自定义标签栏,其中包含另一个小部件/视图。我现在希望该小部件/视图拥有自己的导航堆栈。所以目标是在我从小部件/视图中导航到其他页面时将标签栏保持在顶部。
这个问题几乎就是这样:Permanent view with navigation bar in Flutter,但在那个代码中,还没有MaterialApp
。嵌套 MaterialApp
s 会产生奇怪的结果,我认为这不是一个解决方案。
有什么想法吗?
【问题讨论】:
【参考方案1】:您可以为每个页面创建新的导航器。作为参考检查CupertinoTabView
或者简单的例子:
import 'package:flutter/material.dart';
class Home extends StatelessWidget
Navigator _getNavigator(BuildContext context)
return new Navigator(
onGenerateRoute: (RouteSettings settings)
return new MaterialPageRoute(builder: (context)
return new Center(
child: new Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new Text(settings.name),
new FlatButton(
onPressed: () =>
Navigator.pushNamed(context, "$settings.name/next"),
child: new Text('Next'),
),
new FlatButton(
onPressed: () =>
Navigator.pop(context),
child: new Text('Back'),
),
],
),
);
);
,
);
@override
Widget build(BuildContext context)
return new Scaffold(
body: new Column(
children: <Widget>[
new Expanded(
child: _getNavigator(context),
),
new Expanded(
child: _getNavigator(context),
),
],
),
);
void main()
runApp(new MaterialApp(
home: new Home(),
));
【讨论】:
我实际上知道TabView
,但这不是我的意思。我实际上想为我的标签栏中的每个标签页都有一个导航堆栈,知道如何实现吗?
还有一个问题,当我在我的二级导航器中(所以不是由我的MaterialApp
创建的那个)时,我怎样才能使后退按钮起作用?它只是为我关闭了应用程序:/
@BramVanbilsen,如果是您自己的按钮,请检查您使用的导航器。您应该选择“第二个”,而不是“主要”。如果是脚手架的按钮,请确保脚手架放置在“第二个”导航器的范围内。
另见this related question。
@Mogol Woops,应该提到我在谈论硬件 android 后退按钮。有什么想法吗?【参考方案2】:
你可以把first material app's context
给secondary material app
;
而在secondary material app
,当你需要返回first material app
时,
您可以使用以下行检查辅助应用是否可以弹出:
Navigator.of(secondaryContext).canPop()
如果为真,那么你可以继续使用,否则使用first material app's context
,
像这样:
Navigator.of(parentContext).pop();
否则
【讨论】:
以上是关于如何使用多个导航器的主要内容,如果未能解决你的问题,请参考以下文章