Dart 颤振移除所有路线
我想开发一个注销按钮,将我发送到登录路径,并从Dart 颤振移除所有路线,dart,flutter,Dart,Flutter,我想开发一个注销按钮,将我发送到登录路径,并从导航器中删除所有其他路径。文档似乎没有解释如何制作RoutePredicate或具有任何类型的removeAll功能。我能够通过以下代码完成这一点: Navigator.of(context) .pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false); Navigator.of(上下文) .pushNamedRemoveUntil('/login
导航器中删除所有其他路径。文档似乎没有解释如何制作RoutePredicate
或具有任何类型的removeAll功能。我能够通过以下代码完成这一点:
Navigator.of(context)
.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
Navigator.of(上下文)
.pushNamedRemoveUntil('/login',(路由)=>false);
这里的秘密是使用始终返回false(Route-Route)=>false
的RoutePredicate。在这种情况下,它会删除除我推送的新的/login
路由之外的所有路由。另一种选择是popintil()
这将弹出所有路由,直到您回到指定的路由。我可以使用以下代码段完成:
Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (context) =>
LoginScreen()), (Route<dynamic> route) => false),
Navigator.of(context).pushandremoveintil(MaterialPageRoute(builder:(context)=>
LoginScreen(),(路由=>false),
如果要删除推送路由下的所有路由,RoutePredicate始终返回false,例如(路由路由)=>false。另一种解决方案是使用pushandremoveintil()
。要删除所有其他路由,请使用ModalRoute.withName('/')
参考资料:如果您想返回到特定屏幕,但不使用命名路由器,可以使用下一种方法
例如:
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder: (BuildContext context) => SingleShowPage()),
(Route<dynamic> route) => route is HomePage
);
Navigator.pushandremoveintill(上下文、,
MaterialPageRoute(生成器:(BuildContext上下文)=>SingleShowPage()),
(路由)=>路由为主页
);
使用route is HomePage您可以检查小部件的名称。我不知道为什么没有人提到使用的解决方案,虽然有点晚了,但我认为这本来是正确的方式
SchedulerBinding.instance.addPostFrameCallback((41;)异步{
Navigator.of(context.pushName和removeUntil)(
“/login”,
(路由)=>false);
});
上面的代码删除了“/login”的所有路由和导航标记。这也确保了在导航到新路由之前,通过安排回调来呈现所有帧。这对我来说是可行的。实际上,我是在使用bloc但我的问题是登录屏幕bloc。注销后未进行更新。它保存了以前的模型数据。甚至,我输入了错误的条目,它将进入主屏幕
步骤1:
Navigator.of(context).pushNamedAndRemoveUntil(
UIData.initialRoute, (Route<dynamic> route) => false);
在哪里,,
MyApp()是根类。
根类(即MyApp)代码
class MyApp extends StatelessWidget {
final materialApp = Provider(
child: MaterialApp(
title: UIData.appName,
theme: ThemeData(accentColor: UIColor().getAppbarColor(),
fontFamily: UIData.quickFont,
),
debugShowCheckedModeBanner: false,
//home: SplashScreen(),
initialRoute: UIData.initialRoute,
routes: {
UIData.initialRoute: (context) => SplashScreen(),
UIData.loginRoute: (context) => LoginScreen(),
UIData.homeRoute: (context) => HomeScreen(),
},
onUnknownRoute: (RouteSettings rs) => new MaterialPageRoute(
builder: (context) => new NotFoundPage(
appTitle: UIData.coming_soon,
icon: FontAwesomeIcons.solidSmile,
title: UIData.coming_soon,
message: "Under Development",
iconColor: Colors.green,
)
)));
@override
Widget build(BuildContext context) {
return materialApp;
}
}
void main() => runApp(MyApp());
这是我的注销方法
void logout() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.clear();
// TODO: we can use UIData.loginRoute instead of UIData.initialRoute
Navigator.of(context).pushNamedAndRemoveUntil(
UIData.initialRoute, (Route<dynamic> route) => false);
//TODO: It's working as refresh the screen
runApp(MyApp());
}
void logout()异步{
SharedReferences首选项=等待SharedReferences.getInstance();
preferences.clear();
//TODO:我们可以使用UIData.loginRoute而不是UIData.initialRoute
Navigator.of(context.pushName和removeUntil)(
UIData.initialRoute,(路由路由)=>false);
//TODO:它的作用是刷新屏幕
runApp(MyApp());
}
如果您使用的是NameDrootes,只需通过以下方式即可:
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
Navigator.pushName和removeUntil(上下文“/login”,(路由)=>false);
其中,“/login”是要推送到路由堆栈上的路由
请注意:
此语句删除堆栈中的所有路由,并使推送的路由成为根路由
不确定我是否做对了
但这符合我的使用情况,即通过根窗口小部件弹出
void popUntilRoot({Object result}) {
if (Navigator.of(context).canPop()) {
pop();
popUntilRoot();
}
}
首先查看chrislondon的答案,然后知道如果您没有访问(上下文)的权限,您也可以这样做
navigatorKey.currentState.pushName和removeUntil('/login',(路由)=>false);
在我的情况下,此解决方案有效:
Navigator.pushNamedAndRemoveUntil(" The Route you want to go to " , (Route route) => false);
非常感谢,它成功地工作了。请你发一些链接,我可以理解更多…我有一个问题!在iOS上,通过使用本机视图作为小部件,在使用您的方法后,本机视图不会正确处理并继续存在,因此,我有一个视图将永远不会在后台运行,并且无法处理。这似乎只发生在iOS设备上。@LorenzoDistrice找到解决此问题的方法了吗?我也有类似的问题,即使使用了这个,我仍然有打开的实例。还有其他方法可以推屏并移除堆栈的其余部分吗?我们如何用这种方法传递参数。什么是NoAnimateDulote?在中找不到具有此名称的类Flutter@kashlo不必注意=)我的实现可以使用MaterialPage路由。但是我已经编辑了答案,谢谢。(Route Route)=>Route.isFirst)如果有些人想删除到第一条路线。我更喜欢这个答案!如果您不使用命名路由,我喜欢这个答案。所以,如果您想在导航页面上发送参数,那么您可以使用“Navigator.pushName和removeUntil(context),(r)=>false,参数:{“arg_1”:第一个参数,“arg_2”:第二个参数};”如果您想登录或注册,只需调用根目录:::Navigator.pushName和removeUntil(“/”,(Route Route)=>false);
void logout() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
preferences.clear();
// TODO: we can use UIData.loginRoute instead of UIData.initialRoute
Navigator.of(context).pushNamedAndRemoveUntil(
UIData.initialRoute, (Route<dynamic> route) => false);
//TODO: It's working as refresh the screen
runApp(MyApp());
}
Navigator.pushNamedAndRemoveUntil(context, "/login", (Route<dynamic> route) => false);
void popUntilRoot({Object result}) {
if (Navigator.of(context).canPop()) {
pop();
popUntilRoot();
}
}
to clear route -
onTap: () {
//todo to clear route -
Navigator.of(context).pop();
Navigator.push(context, MaterialPageRoute(builder: (context) => UpdateEmployeeUpdateDateActivity(_token),));
widget.listener.onEmployeeDateClick(_day,_month, _year);
}
navigatorKey.currentState.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
Navigator.pushNamedAndRemoveUntil(" The Route you want to go to " , (Route route) => false);