Знаете ли вы, что можете выполнять бесконтекстнуюнавигацию во Flutter, но подождите… если вы думаете, что я расскажу вам о состоянии Getx Решение для управления, вы ошибаетесь. Вместо этого мы немного рассмотрим более эффективное решение для маршрутизации. Итак, начнем.

Оглавление

1- Бесконтекстная навигация во Flutter

2- Практические примеры (сценарии)

- Бесконтекстная навигация во Flutter

Прежде чем я начну вступление, позвольте мне немного рассказать об основных моментах.

Большинство разработчиков не знают о хороших практиках Flutter и склонны выдавать неверные результаты только для того, чтобы сдать проект в установленный срок.

Кроме того, если вы только начали работать с Flutter, это нормально, но в остальном мы должны обеспечить наилучший результат. (и для нашего внутреннего удовлетворения). Что вы думаете?

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

Как мы это делаем?

Давайте перейдем к следующему разделу и посмотрим на него глубже.

- Практические примеры (сценарии)

Нам нужен NavigatorStateKey для обработки таких ситуаций.

Я знаю, что до сих пор было достаточно теории, и это наверняка прозвучало бы скучно.. 😉 так что давайте немного кода.

Каков сценарий?

Ну, я бы взял двухстраничное приложение с текстом и кнопкой в маршрут.

Вот основные этапы требований, которые нам нужны:

Создайте новый файл dart как «route_generator», чтобы определить все маршруты, связанные с проектом Flutter.

route_generator.dart

class RouteGenerator {

  static Route<dynamic> generateRoutes(RouteSettings settings) {
    switch(settings.name) {
      case '/':
        return MaterialPageRoute(builder: (context) => ScreenOne());
      case '/screen2':
        return MaterialPageRoute(builder: (context) => ScreenTwo());

      default:
        return MaterialPageRoute(builder: (context) => Scaffold(
          body: Center(
            child: Text("Not found ${settings.name}"),
          ),
        ));
    }
  }
}

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

navigation_serive.dart

class NavigationService {

  final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

  dynamic routeTo(String route, {dynamic arguments}) {
    return navigatorKey.currentState?.pushNamed(route, arguments: arguments);
  }

  dynamic goBack() {
    return navigatorKey.currentState?.pop();
  }
}

Как видите, это просто и эффективно.

После того, как мы закончим с этими файлами, пришло время использовать их на экранах.

Экран первый:

build(BuildContext context) {

    //Define object
    NavigationService service = NavigationService();

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("Route to Screen2"),

            ElevatedButton(onPressed: () {
              service.routeTo('/screen2', arguments: 'just a test');
            }, child: Text("Continue")),
          ],
        ),
      ),
    );

}

Экран второй:

build(BuildContext context) {

    //Define object
    NavigationService service = NavigationService();

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("Route to Screen1"),

            ElevatedButton(onPressed: () {
              service.goBack();
            }, child: Text("Back")),
          ],
        ),
      ),
    );

}

После завершения остается одно:

Нам нужно определить следующее для MaterialApp:

  • Ключ навигации
  • Генератор маршрутов
  • Маршрут по умолчанию
return MaterialApp(
      debugShowCheckedModeBanner: true,
      onGenerateRoute: RouteGenerator.generateRoutes,
      initialRoute: '/',
      navigatorKey: NavigationService().navigatorKey,
    );

Вот и все!

Надеюсь, вам понравилось читать это.

Однако я также пролил свет на другие методы маршрутизации.

Вы можете найти их здесь:





Если я что-то пропустил, дайте мне знать в разделе ответов Medium.

Кроме того, дайте мне знать, если у вас есть какие-либо предложения для моей следующей статьи.

P.S. У меня есть собственный канал на YouTube, на который я загружаю контент, связанный с Flutter Series, GitHub и т. д. Если вы найдете материалы своего типа, ставьте лайк, делитесь и подписывайтесь, так как это мотивирует меня создавать для вас больше! Спасибо.