Прямое использование класса Navigator без MaterialApp в Flutter (инициализация)

#flutter #flutter-navigation

#flutter #flutter-навигация

Вопрос:

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

Следующий код возвращает Null check operator used on a null value ошибку, хотя все поля, которые, как мне известно, необходимо предоставить, предоставлены. Когда включен закомментированный код, который затем устанавливает все настраиваемые поля Navigator, сообщение об ошибке по-прежнему появляется.

 import 'package:flutter/material.dart';

void main() {
  runApp(CustomNavigation());
}

class CustomNavigation extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Navigator(
      initialRoute: '/',
      onGenerateRoute: (routeSettings) {
        return MaterialPageRoute(
            builder: (context) => Container(
                  color: Colors.red,
                ));
      },
      onUnknownRoute: (routeSettings) =>
          MaterialPageRoute(builder: (BuildContext context) {
        return Container(
          color: Colors.green,
        );
      }),
      // key: GlobalKey(),
      // onGenerateInitialRoutes: (state, string) => [
      //   MaterialPageRoute(builder: (BuildContext context) {
      //     return Container(
      //       color: Colors.white,
      //     );
      //   }),
      // ],
      // onPopPage: (route, result) => true,
      // pages: [
      //   MaterialPage(
      //       child: Container(
      //     color: Colors.purple,
      //   ))
      // ],
      // observers: [NavigatorObserver()],
      // reportsRouteUpdateToEngine: true,
      // restorationScopeId: 'I am a string',
      // transitionDelegate: DefaultTransitionDelegate(),
    );
  }
}
  

Какое значение null вызывает это сообщение об ошибке?

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

1. Насколько я понимаю, класс Navigator все еще используется в Navigation 2.0 (либо под капотом маршрутизатора, либо напрямую). Класс Pages и аргумент pages в классе Navigator являются новыми (см. Раздел «Страницы» в статье, на которую вы ссылались, и в документе Router ). Независимо от того, используется ли аргумент pages или onGenerateRoute, произошла ошибка с нулевым значением, описанная выше. Я подумал, что мог бы также попытаться исправить это с помощью более знакомой навигационной системы, чтобы уменьшить вероятность путаницы переменных из-за неправильного понимания навигации 2.0!

Ответ №1:

Понял! Виджет наложения (содержащий маршруты, порядком которых управляет Навигатор, для создания удобства навигации, при этом маршруты, расположенные выше в оверлее, отображаются после маршрутов, расположенных ниже в оверлее), требует информации о текстовом направлении! Значение null относится к Directionlity.of(context) запрошенному во время отображения наложения. Добавление виджета направленности решает эту проблему, как в исправленном коде здесь:

 import 'package:flutter/material.dart';

void main() {
  runApp(CustomNavigation());
}

class CustomNavigation extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.ltr,
      child: Navigator(
          onGenerateRoute: (routeSettings) {
        return MaterialPageRoute(
            builder: (context) => Container(
                  color: Colors.red,
                ));
      }),
    );
  }
}
  

(Чтобы превратить этот минимальный рабочий пример для отладки с нулевым значением во что-то полезное / пользовательскую навигацию, используйте оператор switch routeSettings.name в onGenerateRoute и напишите класс, расширяющий PageRoute для использования вместо MaterialPageRoute .)