какова лучшая практика Flutter Navigator 2.0 для больших приложений?

#flutter #navigation #navigator

Вопрос:

Мое мобильное приложение написано на угловом и ионном языках. В нем много-много страниц. Теперь я хочу переписать его в flutter.

Я прочитал много статей для flutter navigator 2.0. Им всегда нравится внизу.

 class MyAppRouterDelegate extends RouterDelegate<MyAppConfiguration>{

  String? _selectedColorCode;
  String? _selectedShapeBorderType;

  @override
  Widget build(BuildContext context) {
    List<Page> stack = [
      HomePage(),
      if(_selectedColorCode != null){
        ColorPage(),
      }
      if(_selectedShapeBorderType != null){
        ShapeBorderPage(),
      }
    ];
    return Navigator(
      key: navigatorKey,
      pages: stack,
      onPopPage: (route, result) {
        if (!route.didPop(result)) return false;
        if (selectedShapeBorderType == null) selectedColorCode = null;
        selectedShapeBorderType = null;
        return true;
      },
    ); 
}

 

Они используют множество свойств в RouterDelegate для описания всего состояния маршрутизатора и множество if-else для создания текущего стека страниц.

 class MyAppConfiguration {
  final String colorCode;
  final ShapeBorderType shapeBorderType;
  final bool unknown;

  MyAppConfiguration.shapeBorder(String colorCode, ShapeBorderType shape)
      : unknown = false,
        shapeBorderType = shape,
        loggedIn = true,
        colorCode = colorCode;

  MyAppConfiguration.color(String colorCode)
      : unknown = false,
        shapeBorderType = null,
        loggedIn = true,
        colorCode = colorCode;

  MyAppConfiguration.home()
      : unknown = false,
        shapeBorderType = null,
        loggedIn = true,
        colorCode = null;

  MyAppConfiguration.unknown()
      : unknown = true,
        shapeBorderType = null,
        loggedIn = null,
        colorCode = null;

  bool get isUnknown => unknown == true;
  bool get isHomePage => unknown == false amp;amp; loggedIn == true amp;amp; colorCode == null amp;amp; shapeBorderType == null;
  bool get isColorPage =>  unknown == false amp;amp; loggedIn == true amp;amp; colorCode != null amp;amp; shapeBorderType == null;
  bool get isShapePage =>  unknown == false amp;amp; loggedIn == true amp;amp; colorCode != null amp;amp; shapeBorderType != null;
  bool get isSplashPage =>  unknown == false amp;amp; loggedIn == null;
}

 

И они используют конфигурационный файл, который имеет так много свойств, чтобы описать все маршруты для сопоставления с URL.
Это решение так ужасно, когда в моем приложении так много страниц.
Есть ли изящное решение?
Спасибо.

Комментарии:

1. Не путайте маршруты с детскими виджетами. Сколько экранов у приложения? Вы можете создавать маршруты для главных страниц, т. е., если это рынок, используйте маршруты для определения страницы входа в систему, домашней страницы клиента, страницы редактирования профиля, отображения сведений о продукте, страницы оформления заказа, страницы истории заказов. Все остальное внутри них может быть отдельными виджетами без необходимости создавать маршруты для всех них и определять их в вашем main.dart.

2. Спасибо. более 50 страниц и непрерывный рост. Вы имеете в виду один маршрут для многих страниц бизнес-потока? И поддерживать переход по страницам, переключая только виджеты на странице?

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