Flutter - передать данные обратно с помощью .popUntil - PullRequest
0 голосов
/ 29 августа 2018

Я использую Navigator.pop и с легкостью возвращаю данные на 1 экран. Однако, если я использую Navigator.popUntil, каков приемлемый способ передачи объекта обратно на экран назначения?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Вы можете использовать arguments в RouteSettings для передачи данных обратно к определенному 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;
   }
});

Обратите внимание: вам нужно инициализировать arguments, иначе он будет нулевым, вот для чего (1)

0 голосов
/ 29 августа 2018

Там нет ни одного. Это также не имеет смысла, потому что результат должен быть возвращен маршруту, который выдвинул маршрут.

Если вам действительно нужно это сделать, используйте несколько вызовов 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
...