Сообщество StackOverflow!
Я пытаюсь создать мобильное / веб-приложение во Flutter со стати c «всегда открытым» ящиком в Интернете.
Так что Я сделал, я создал и маршрутизатор (с Fluro) и использовать его в функции onGenerateRoute моего MaterialApp. Ребенок будет создан из роутера, и я передам его в «MainLayout».
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MyApp',
theme: appTheme,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
FlutterI18nDelegate(
translationLoader: FileTranslationLoader(
basePath: 'assets/i18n',
fallbackFile: 'de_DE',
useCountryCode: true),
),
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('de', 'DE'), // German
],
initialRoute: NavUtils.initialUrl,
onGenerateRoute: router.generator,
navigatorKey: _navigatorKey,
builder: (context, child) {
return MultiBlocProvider(
providers: [
BlocProvider.value(
value: _authenticationBloc,
),
BlocProvider.value(
value: _userSettingsBloc,
),
BlocProvider.value(
value: _organizationBloc,
),
BlocProvider.value(
value: _reportsBloc,
),
],
child: BlocBuilder<AuthenticationBloc, AuthenticationState>(
builder: (context, state) {
if (state is AuthenticationAuthenticated) {
return MainLayout(
child: child,
drawerKey: _drawerKey,
navigatorKey: _navigatorKey,
);
} else {
return Scaffold(
backgroundColor: mainBackground,
drawer: DrawerMenu(
navigatorKey: _navigatorKey,
drawerKey: _drawerKey,
),
body: SafeArea(
child: child,
),
);
}
},
),
);
},
);
}
и содержимое моего MainLayout ()
class MainLayout extends StatelessWidget {
final Widget child;
final GlobalKey<ScaffoldState> drawerKey;
final GlobalKey<NavigatorState> navigatorKey;
MainLayout(
{Key key,
@required this.child,
@required this.drawerKey,
@required this.navigatorKey})
: super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
key: drawerKey,
backgroundColor: mainBackground,
drawer: MediaQuery.of(context).size.width >= 769
? null
: DrawerMenu(
navigatorKey: navigatorKey,
drawerKey: drawerKey,
),
body: SafeArea(
child: Container(
child: Row(
children: <Widget>[
MediaQuery.of(context).size.width >= 769
? DrawerMenu(
navigatorKey: navigatorKey,
drawerKey: drawerKey,
)
: Container(),
Expanded(
child: child,
),
],
),
),
),
);
}
}
У меня проблема в том, что ie. Мой DrawerMenu () не может найти навигатор в контексте. Приводит меня к таким проблемам, как я не могу использовать любой виджет всплывающей подсказки, потому что он не находит оверлей маршрутизация.
Кто-нибудь может мне помочь с этим? Достаточно ли этой информации для оказания какой-либо помощи?
Обновление
С вашим вопросом и вашим ответом здесь на StackOverflow Я понял, что мне нужно использовать это разные. Я «извлек» весь материал и создал Navigator в Scaffold, например, так:
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'MyApp',
theme: appTheme,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
FlutterI18nDelegate(
translationLoader: FileTranslationLoader(
basePath: 'assets/i18n',
fallbackFile: 'de_DE',
useCountryCode: true),
),
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('de', 'DE'), // German
],
initialRoute: NavUtils.initialUrl,
onGenerateRoute: (RouteSettings settings) {
_navigatorKey.currentState.popAndPushNamed(settings.name);
},
home: Builder(
builder: (context) => MultiBlocProvider(
providers: [
BlocProvider.value(
value: _authenticationBloc,
),
BlocProvider.value(
value: _userSettingsBloc,
),
BlocProvider.value(
value: _organizationBloc,
),
BlocProvider.value(
value: _reportsBloc,
),
],
child: Scaffold(
key: _drawerKey,
backgroundColor: mainBackground,
drawer: MediaQuery.of(context).size.width >= 769
? null
: DrawerMenu(
navigatorKey: _navigatorKey,
drawerKey: _drawerKey,
),
body: SafeArea(
child: Container(
child: Row(
children: <Widget>[
MediaQuery.of(context).size.width >= 769
? DrawerMenu(
navigatorKey: _navigatorKey,
drawerKey: _drawerKey,
)
: Container(),
Expanded(
child: Navigator(
key: _navigatorKey,
initialRoute: NavUtils.initialUrl,
onGenerateRoute: router.generator,
),
),
],
),
),
),
),
),
),
);
}
Единственная проблема сейчас в том, как мне получить URL, который пользователь вводит в адресная строка браузера, на мой навигатор.
Пока я использую _navigatorKey.currentState.popAndPushNamed(settings.name);
в своем MaterialApp, но это удаляет URL в адресной строке после нажатия Enter. (Но на самом деле он переходит на правильную страницу)
Есть ли способ сохранить эту последовательность?