#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 .)