Как использовать провайдера в onGenerateRoute?
Как я могу использовать свой UserProvider в onGenerateRoute? Я хочу проверить, является ли пользователь логгером, используя UserProvider.isLogged(), но когда я пытаюсь получить Userprovider, я должен передать контекст, которого у меня нет в Router.
Я уже пытался изменить generateRoute на нестатический и передать контекст через конструктор в маршрутизатор, но он выдает ошибку.
main.dart
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: <SingleChildCloneableWidget>[
ChangeNotifierProvider(builder: (_) => BottomNavigationBarProvider()),
ChangeNotifierProvider(builder: (_) => UserProvider()),
],
child: MaterialApp(
initialRoute: '/',
onGenerateRoute: Router.generateRoute,
title: 'Title,
theme: ThemeData(
primarySwatch: Colors.blue,
),
),);
}
}
Router.dart
class Router {
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (_) => HomePage());
break;
case '/login':
return MaterialPageRoute(builder: (_) => LoginPage());
break;
case '/register':
return MaterialPageRoute(builder: (_) => RegisterPage());
break;
case '/terms':
return MaterialPageRoute(builder: (_) => TermsPage());
break;
case '/home':
return MaterialPageRoute(builder: (_) {
return HomePage();
});
break;
default:
return MaterialPageRoute(
builder: (_) => Scaffold(
body: Center(
child: Text('No route defined for ${settings.name}')),
));
break;
}
}
}
=== МОЯ ПОПРОБУЙТЕ ===
main.dart
onGenerateRoute: Router(context).generateRoute,
Router.dart
class Router {
Router(this.context);
BuildContext context;
Route<dynamic> generateRoute(RouteSettings settings) {
final UserProvider userProvider = Provider.of<UserProvider>(context);
userProvider.isLogged();
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (_) => HomePage());
break;
case '/login':
return MaterialPageRoute(builder: (_) => LoginPage());
break;
case '/register':
return MaterialPageRoute(builder: (_) => RegisterPage());
break;
case '/terms':
return MaterialPageRoute(builder: (_) => TermsPage());
break;
case '/home':
return MaterialPageRoute(builder: (_) {
return HomePage();});
break;
default:
return MaterialPageRoute(
builder: (_) => Scaffold(
body: Center(
child: Text('No route defined for ${settings.name}')),
));
break;
}
}
}
Эта "Моя попытка" дает мне ошибку. Как я могу это сделать? "Не удалось найти правильный ProviderProvider> над этим виджетом MyApp."
2 ответа
В таком случае
context
не включает провайдера. Таким образом, этого можно достичь, поместив MaterailApp в метод сборки MultiProvider, например:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context1) {
return MultiProvider(
providers: <SingleChildCloneableWidget>[
ChangeNotifierProvider(builder: (_) => BottomNavigationBarProvider()),
ChangeNotifierProvider(builder: (_) => UserProvider()),
],
builder: (context2, _) => MaterialApp(
initialRoute: '/',
onGenerateRoute: Router(context2).generateRoute,
title: 'Title',
theme: ThemeData(
primarySwatch: Colors.blue,
),
),
);
}
}
Теперь
UserProvider
можно получить доступ из
context2
позвонив
Provider.of<UserProvider>(context2)