Flutter 导航,重新打开页面而不是再次推送

标签 flutter mobile-application flutter-navigation

我是 flutter 的新手,我正在开发一个具有多个屏幕的应用程序。

我想知道如何阻止 flutter 创建同一路线的多个屏幕,
例如我有 第1页第2页 ,如果我单击按钮导航到第 2 页并再次单击同一个按钮,应用程序将推送一个新屏幕 第2页我会得到它两次,如果我点击返回按钮,它会将我发送回第一个创建的 第2页

有没有办法只创建每个页面一次然后重新打开它,如果它已经被推送到堆栈中?

我正在使用 Navigator.push对于我所有的导航

最佳答案

在这里使用一个简单的逻辑

  • 如果新页面与当前页面相同,则使用 Navigator.push(context,route) .
  • 如果新页面不同,则使用 Navigator.pushReplacement(context,route) .


  • 如果您使用的是命名路由,则为
  • 与当前页面相同,使用 Navigator.pushNamed(context,name) .
  • 不同的页面,使用 Navigator.pushReplacementNamed(context,name) .


  • 完整代码示例
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: SO(),
        );
      }
    }
    
    class SO extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: PageOne(),
        );
      }
    }
    
    class PageOne extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Page 1'),
          ),
          backgroundColor: Colors.amber,
          body: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                RaisedButton(
                  onPressed: () {
                    print('creating replacement page 1');
                    Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) {
                      return PageOne();
                    }));
                  },
                  child: Text('Go to page 1'),
                ),
                RaisedButton(
                  onPressed: () {
                    print('creating new page 2');
                    Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
                      return PageTwo();
                    }));
                  },
                  child: Text('Go to page 2'),
                ),
              ],
            ),
          ),
        );
      }
    }
    
    class PageTwo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Page 2'),
          ),
          backgroundColor: Colors.brown,
          body: Center(
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: <Widget>[
                RaisedButton(
                  onPressed: () {
                    print('creating new page 1');
                    Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => PageOne()));
                  },
                  child: Text('Go to page 1'),
                ),
                RaisedButton(
                  onPressed: () {
                    print('creating replacement page 2');
                    Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => PageTwo()));
                  },
                  child: Text('Go to page 2'),
                ),
              ],
            ),
          ),
        );
      }
    }
    

    关于Flutter 导航,重新打开页面而不是再次推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59457306/

    相关文章:

    dart - PageView : Disable the default scrolling and replace it with Tap event

    dart - 为什么 cupertino_icons 中的图标很少?

    Flutter:如何使用多个流组合

    java - 打开 Android 应用程序时重定向到网页

    android - 用于嵌套导航的 Flutter WillPopScope

    dart - 如何在 Flutter TextField 中使用 BLOC 模式进行后端验证?

    android - 如何从 laravel web 应用程序创建 android 应用程序?

    ios - 如何通过 Objective-C 中的 Speech 框架实现语音转文本?

    flutter - 如何导航到屏幕并删除所有溃败历史记录 [注销功能]

    flutter - 使用 go_router 时如何从子路由推送到根导航器