Проблема вложенной маршрутизации Flutter - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь реализовать вложенную маршрутизацию во Flutter.

Вот образец из моего дерева проекта.

enter image description here

When I am on the Page widget and try to head back to the LandingPage widget using the backbutton, the app closes.

can someone help me with that

Here is a code sample:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Code Sample for Navigator',
      // MaterialApp contains our top-level Navigator
      initialRoute: '/',
      routes: {
        '/': (BuildContext context) => Home(),
        '/app': (BuildContext context) => App(),
      },
    );
  }
}



class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      ..
      child: Builder(
        builder: (context)=> Navigator(
          initialRoute: 'LandingPage',

          onGenerateRoute: (RouteSettings settings) {
            WidgetBuilder builder;
            switch (settings.name) {
              case 'LandingPage':
                builder = (BuildContext _) => LandingPage();
                break;
              case 'Page':
                builder = (BuildContext _) => Page();
                break;
              default:
                throw Exception('Invalid route: ${settings.name}');
            }
            return MaterialPageRoute(builder: builder, settings: settings);
          },

        ); 
      )
    );
  }
}


Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Я получил его, правильно используя Navigator.maybePop() с WillPopScope().

Согласно Flutter maybePop(), он используется вместо pop() для обработки нажатия пользователем кнопку возврата устройства.

, изменив его поведение во вложенном навигаторе, нажатие кнопки возврата не приведет к открытию навигатора root, а вызовет только вложенный навигатор.

например:

class SecondNavigator extends StatefulWidget {
  SecondNavigator({Key key}) : super(key: key);
  @override
  _SecondNavigatorState createState() => _SecondNavigatorState();
}

class _SecondNavigatorState extends State<SecondNavigator> {
  final GlobalKey<NavigatorState> navigatorKey = new GlobalKey();
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      child: Navigator(
                key: navigatorKey,
                ...
              ),
      onWillPop: () async {
        final NavigatorState navigator = navigatorKey.currentState;
        return !await navigator.maybePop();        
      },
    );
  }
}

Полный пример был предоставлен здесь

обязательно ознакомьтесь с документацией flutter willpop(), чтобы лучше понять maypop()

0 голосов
/ 03 августа 2020

Стандартный путь к подобным страницам

    initialRoute: "/screen1",
    routes: <String, WidgetBuilder>{
      '/screen1': (BuildContext context) =>  Screen1(),
      '/screen2': (BuildContext context) =>  Screen2(),
      '/screen3': (BuildContext context) =>  Screen3(),
      '/screen4': (BuildContext context) =>  Screen4()
    },
    onUnknownRoute: (RouteSettings settings) {
      return MaterialPageRoute<void>(
        settings: settings,
        builder: (BuildContext context) =>
            Scaffold(body: Center(child: Text('Not Found'))),
      );
    },
  )
);
...