使用.popUntil颤动传递数据

Jos*_*ane 5 navigator dart flutter

我一直在使用Navigator.pop并轻松地将数据传递回1屏幕。但是,如果使用Navigator.popUntil,将对象传递回目标屏幕的可接受方法是什么?

hun*_*ghd 13

您可以使用argumentsinRouteSettings将数据传回特定的Route.

例如:


// in MaterialApp
MaterialApp(
   onGenerateRoute: (settings) {
      switch (settings.name) {
         case '/':
            return MaterialPageRoute(
                     settings: RouteSettings(name: '/', arguments: Map()),  // (1)
                     builder: (_) => HomePage()
                  );
      }
   }
)

// in HomePage
Navigator.of(context).push(MaterialPageRoute(builder: (_) => StuffPage())
                     .then(_) {
                        final arguments = ModalRoute.of(context).settings.arguments as Map;
                        final result = arguments['result'];
                     };

// in StuffPage
Navigator.of(context).popUntil((route) {
   if (route.settings.name == '/') {
      (route.settings.arguments as Map)['result'] = 'something';
      return true;
   } else {
      return false;
   }
});

Run Code Online (Sandbox Code Playgroud)

请注意:您必须初始化arguments,否则它将为空,这就是(1)的目的

  • `RouteSettings(name: '/', argument: Map())` 这是最重要的一行代码 (3认同)

bof*_*mer 2

空无一人。这也没有意义,因为结果应该返回给推送该路由的路由。

如果您确实必须这样做,请使用多个pop调用:

// Widget of Route A:
String resultOfC = await Navigator.push(context, routeB);


// Widget of Route B:
String resultOfC = await Navigator.push<String>(context, routeC);
Navigator.pop(context, resultOfC); // pass result of C to A


// Widget of Route C:
Navigator.pop(context, 'my result'); // pass result to B
Run Code Online (Sandbox Code Playgroud)