如何正确使用popUntil到达堆栈的根?

时间:2019-05-21 12:42:36

标签: dart flutter

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

我的代码:

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',但是那还是行不通。

2 个答案:

答案 0 :(得分:0)

popUntil中的路线具有名为isFirst的属性,如果该路线是导航器中的第一条路线,则返回true。因此,在您的情况下,您可以使用类似以下内容的

Navigator.of(context).popUntil((route) {
      return route.isFirst;
    });

答案 1 :(得分:0)

您可以尝试

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

应用defaultRouteName作为应用启动时打开的第一个屏幕。

编辑

因此,如下所述,命名路由不适用于Navigator.defaultRouteNameroute.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('/'));

希望对您有用。