首页 > 解决方案 > 如何正确使用 popUntil 到达栈根?

问题描述

我已经推到两个屏幕并希望回到我的主页。我尝试通过使用 popUntil 来做到这一点,但是它没有给我 req 结果而只是显示黑屏。我是否需要为我的主页设置一条新路由,即使我不想创建它的新实例?

我的代码:

class Completed extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

  return MaterialApp(
      title: 'Completed Screen',
      home: CompleteScreen(),
      routes: <String, WidgetBuilder>{
       // "/my-app": (BuildContext context) => MyApp()
      }
 );
}
}

class CompleteScreen extends StatelessWidget{
  @override
  Widget build(BuildContext context){

    Container Complete = Container(
        child: Column(
           .....
                  FlatButton(
                    onPressed: (){        
                      Navigator.popUntil(
                        context,
                        ModalRoute.withName('/'),
                      ); 
                      // Navigator.popUntil(context, ModalRoute.withName(Navigator.defaultRouteName));
                    },              
                ),

          ],
        ));

    return Scaffold(
        body:  Complete
    );
  }
}


我的主页



void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      home: DefaultTabController(length: 2,child: MyHomePage(title: '')),
      routes: <String, WidgetBuilder>{
       "/TaskScreen": (BuildContext context) => new task(),
      }
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

 @override
  Widget build(BuildContext context){

   final list =  ListView.builder(
     itemBuilder: (context, position) {
       return Ink(
         child: InkWell(
           onTap: (){
             Navigator.of(context).pushNamed("/TaskScreen");
           },
           child: Card(
             ...
           ),),); },);

   return Scaffold(
   ...
 }
}

我尝试使用 '/TaskScreen' 和 '/my-app' 但即使这样也没有用。

标签: dartflutter

解决方案


你可以试试这个

Navigator.popUntil(
      context,
      ModalRoute.withName(
        Navigator.defaultRouteName,
      ),
    ),

就像defaultRouteName应用程序启动时打开的第一个屏幕一样。

编辑

因此,如下所述,命名路线不适用于Navigator.defaultRouteNamenor route.isFirst,我发现解决此问题的最佳方法是在主页中声明您的所有路线,因为这些路线将成为全球性的(或者这就是我所理解的),所以您的代码会结束这样的事情

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My App',
      home: DefaultTabController(length: 2,child: MyHomePage(title: '')),
      routes: <String, WidgetBuilder>{
        "/": (BuildContext context) => MyApp(), (or MyHomePage())
        "/TaskScreen": (BuildContext context) => new task(),
      }
    );
  }
}

完成后,只要您想返回主页,您只需调用

Navigator.popUntil(context, ModalRoute.withName('/'));

希望这对你有用。


推荐阅读