Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振移除所有路线_Dart_Flutter - Fatal编程技术网

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);