【问题标题】:How to push and pop until to a specific route in flutter如何在颤动中推送和弹出直到特定路线
【发布时间】:2021-11-25 06:45:35
【问题描述】:

我正在制作一个应用程序,在我的退出对话框中,我得到了这个代码。

  Navigator.of(context).pushAndRemoveUntil(
                    MaterialPageRoute(builder: (context) {
                  return AuthScreen();
                }), (route) {
                  // if( route is (MaterialPageRoute('/')))
                  // {

                  // }
                  // print(route);
                  return false;
                });


我只想推送 AuthScreen 并删除,直到路由屏幕。该怎么做?

所以在这段代码之后,堆栈包含根屏幕和 AuthScreen。

【问题讨论】:

    标签: flutter dart navigation


    【解决方案1】:

    你可以这样做:

    Navigator.pushAndRemoveUntil(
        context,   
        MaterialPageRoute(builder: (BuildContext context) => AuthScreen()), 
        ModalRoute.withName('/') // Replace this with your root screen's route name (usually '/')
    );
    

    您可以尝试的另一种方法是:

    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (BuildContext context) => AuthScreen()),
      (Route<dynamic> route) => route is RootPage (your root page's type)
    );
    

    还有一个:

    Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (BuildContext context) => AuthScreen()),
      (Route<dynamic> route) => route.isFirst (pop until your first page)
    );
    

    示例应用:

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    import 'package:in_app_update/in_app_update.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          initialRoute: '/',
          routes: {
            '/': (context) => MyHome(),
          },
        );
      }
    }
    
    class MyHome extends StatelessWidget {
      const MyHome({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Sample App'),
          ),
          body: Center(
            child: TextButton(
              onPressed: () => Navigator.push(
                  context, MaterialPageRoute(builder: (context) => MyChild())),
              child: Text('To child page'),
            ),
          ),
        );
      }
    }
    
    class MyChild extends StatelessWidget {
      const MyChild({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('My Child'),
          ),
          body: Center(
            child: TextButton(
              onPressed: () => Navigator.pushAndRemoveUntil(
                  context,
                  MaterialPageRoute(
                      builder: (BuildContext context) => MySecondChild()),
                  ModalRoute.withName('/')),
              child: Text('Push to Second Child and remove until homepage'),
            ),
          ),
        );
      }
    }
    
    class MySecondChild extends StatelessWidget {
      const MySecondChild({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('My Second Child'),
          ),
          body: Center(
            child: TextButton(
              onPressed: () => Navigator.pop(context),
              child: Text('Pop'),
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 我试过这个但我得到了黑屏
    • 没有命名路线有什么办法
    • 如果出现黑屏,您是否在MaterialApp 中将initialRoute 设置为'/'?我也在上面的答案中更新了替代方案。
    • 是的。 '/': (上下文) => MyHome(),
    • 我没明白。什么是根页面的类型?
    猜你喜欢
    • 2020-03-31
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2019-12-09
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多