Преимущество статической маршрутизации к динамической на Flutter

Я могу увидеть это MaterialApp приложение может получать маршруты.

1. Статическая маршрутизация

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/page1': (context) => Page1(title: "Main page"),
...

И покажите их в виджетах вроде:

myKey.currentState.pushNamed("/page1");

Есть и другие параметры, например onGenerateRoute а также initialRoute которые меня больше смущают.

2. Динамические страницы

onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondRoute()),
  );
}

Вопрос

Мне интересно, что означают эти параметры, и позволяя эту "ответственность" MaterialApp, и почему мы должны это сделать, возможно, что-то связанное с управлением памятью или как Widget жизненный цикл работает, что ли?

В чем разница между 1. и 2.?

1 ответ

Решение

Ответ кроется больше в вашей архитектуре, чем в чем-либо еще.

1. Статическая маршрутизация - лучший вариант с точки зрения управления сложностью проекта. Маршруты четко определены для понимания несколькими разработчиками, а код навигации намного проще,Navigator.of(context).pushNamed('your-route'); против

Navigator.push(
   context,
   MaterialPageRoute(builder: (context) => SecondRoute()),
 );

2. Динамические страницы обычно используются в учебных пособиях и т.п., чтобы сократить шаблонный код. Это просто ярлык для навигации. Обратной стороной этого является то, что становится трудно управлять маршрутами, поэтому следует ограничиться краткими учебными пособиями.

3. Сгенерированные маршруты Тем не менее, есть третий вариант, который, на мой взгляд, лучший из двух, и это сгенерированные маршруты. Это самая чистая и простая в обслуживании конструкция. Существует большой учебник здесь об этом. Вот краткое изложение:

  1. Объявить маршруты:
class RoutePaths {
  static const Start = '/';
  static const SecondScreen = 'second'
}
  1. Объявите свой роутер:
class Router {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case RoutePaths.Start:
        return MaterialPageRoute(builder: (_) => YourFirstScreenWidget());

      case RoutePaths.SecondScreen:
        // you can do things like pass arguments to screens
        final event = settings.arguments as Event;
        return MaterialPageRoute(
            builder: (_) => YourSecondScreenWidget(event: event));

      default:
        return MaterialPageRoute(
            builder: (_) => Scaffold(
                  body: Center(
                    child: Text('No route defined for ${settings.name}'),
                  ),
                ));
    }
  }
}

  1. Объявите это в main.dart
initialRoute: RoutePaths.Start,
onGenerateRoute: Router.generateRoute,
  1. Навигация
// arguments: event is an optional parameter to send to secondScreen
Navigator.of(context).pushNamed(RoutePaths.SecondScreen, arguments: event);
Другие вопросы по тегам