如何在颤动中推动和弹出,直到到达特定的路线

  • 本文关键字:颤动 flutter dart navigation
  • 更新时间 :
  • 英文 :


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

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

我只想推AuthScreen并删除,直到路由屏幕。如何做到这一点?

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

您可以这样做:

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'),
),
),
);
}
}

写这个答案时要考虑到人们可能遇到的其他情况并寻找解决方案。

如果你已经实现了自己的自定义PageRoute/PageRoutBuilder,并在任何地方使用它来推送和弹出页面,那么建议的答案可能不起作用。至少,我就是这样。

克服这个问题的一种方法是,像每个人(以及文档本身(建议的那样,使用命名路线。但不管"为什么",如果你不想那样做,我来这里是为了提出一个新的解决方案。

  1. 您可以给自己的PageRoute实现一个实例变量,比如一个String(但不要。如果您真的想追求这个路径,至少要使用一个枚举(,其中这个变量将是您的页面名称(如HomePageView(。稍后,当您希望pushAndRemoveUntil直到时,请编写第二个参数,如下所示:
Navigator.of(context).pushAndRemoveUntil(
    MyCustomPageBuilder(MyStatelessView()),
    (Route<dynamic> route) {
        if (route is MyCustomPageBuilder && route.instanceVariable == 'HomePageView') {
             return true;
        }
return false;
    }
);
  1. 您可以将自定义PageRoute实现设计为Generic,在推送新页面时,您可以编写:

Navigator.of(context).push(MyCustomPageBuilder<HomePageView>)

然后,在按下MyStatelessView并弹出前几页直到HomePageView时,您可以写:

Navigator.of(context).pushAndRemoveUntil(
    MyCustomPageBuilder<MyStatelessView>(MyStatelessView()),
    (Route<dynamic> route) {
        if (route is MyCustomPageBuilder<HomePageView>) {
             return true;
        }
return false;
    }
);

它们都能工作。但我建议你选择第二个。

相关内容

  • 没有找到相关文章

最新更新