对于路由,我使用
auto_route
并添加了通过提供程序监听更改 reevaluateListenable: authProvider
但是当我的提供程序值更改时,没有任何反应,为什么监听更改不起作用并且它们不打开另一个页面?
主要
Widget build(BuildContext context) {
return Consumer<AuthProvider>(
builder: (context, authProvider, child) {
return MaterialApp.router(
theme: darkTheme,
routerConfig: _appRouter.config(
reevaluateListenable: authProvider,
navigatorObservers: () => [
TalkerRouteObserver(
GetIt.I<Talker>(),
),
],
),
title: 'Flutter Demo',
);
},
);
}
authguard
class AuthGuard extends AutoRouteGuard {
@override
void onNavigation(NavigationResolver resolver, StackRouter router) async {
final AuthProvider appState = AuthProvider();
if (appState.isLoggedIn) {
resolver.next(true);
} else {
resolver.redirect(const AuthRoute());
}
}
}
身份验证提供者
class AuthProvider extends ChangeNotifier implements Listenable {
bool _isLoggedIn = false;
bool get isLoggedIn => _isLoggedIn;
void login() {
_isLoggedIn = true;
notifyListeners();
}
void logout() {
_isLoggedIn = false;
notifyListeners();
}
}
登录屏幕
void onPressedMethod(bool isRegister) {
final authProvider = Provider.of<AuthProvider>(context, listen: false);
if (isRegister) {
authProvider.login();
} else {
authProvider.login();
}
}
这里有一些引起我注意的事情
1.AuthGuard 正在其 onNavigation 方法中创建一个新的 AuthProvider 实例,该实例未连接到正在侦听的实例。 通过在防护中使用 Provider.of(context) 访问现有的 AuthProvider 实例来修复它。
2.在
onPressedMethod
中,您使用的是 Provider.of(context, listen: false)
,它会忽略更改。
删除 listen: false
参数以确保监听和重建。
void onNavigation(NavigationResolver resolver, StackRouter router) async {
final authProvider = Provider.of<AuthProvider>(context); // access instance like you did inside onPressed
if (authProvider.isLoggedIn) {
resolver.next(true);
} else {
resolver.redirect(const AuthRoute());
}
}
void onPressedMethod(bool isRegister) {
final authProvider = Provider.of<AuthProvider>(context); // Listen for changes by removing listen : false
if (isRegister) {
authProvider.login();
} else {
authProvider.login(); // why login in both ???
}
}
还要确保您已在小部件树中的适当级别使用 ChangeNotifierProvider 正确注册了 AuthProvider。