如何使用多个导航器

Posted

技术标签:

【中文标题】如何使用多个导航器【英文标题】:How to use multiple navigators 【发布时间】:2018-03-12 04:20:38 【问题描述】:

我目前在我的颤振应用程序中有一个MaterialApp,这使得Navigator 的使用变得非常容易,这很棒。但是,我现在正试图弄清楚如何为特定视图/小部件创建更多导航器。例如,我有一个自定义标签栏,其中包含另一个小部件/视图。我现在希望该小部件/视图拥有自己的导航堆栈。所以目标是在我从小部件/视图中导航到其他页面时将标签栏保持在顶部。 这个问题几乎就是这样:Permanent view with navigation bar in Flutter,但在那个代码中,还没有MaterialApp。嵌套 MaterialApps 会产生奇怪的结果,我认为这不是一个解决方案。

有什么想法吗?

【问题讨论】:

【参考方案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 contextsecondary material app; 而在secondary material app,当你需要返回first material app时, 您可以使用以下行检查辅助应用是否可以弹出:

 Navigator.of(secondaryContext).canPop()

如果为真,那么你可以继续使用,否则使用first material app's context, 像这样:

Navigator.of(parentContext).pop();

否则

【讨论】:

以上是关于如何使用多个导航器的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个自定义视图控制器与导航控制器一起使用?

如何使用多个 NavHost 片段创建深层链接

如何将多个视图控制器推送到导航控制器上

Xamarin.Forms Shell 如何在路由导航中向字符串注入多个不同的值

dedecms织梦如何调用指定的多个栏目导航

如何在 NativeScript 应用程序中导航多个页面?