如何解决提供商登录注销异常
- LoginPage
- OnboardingPage
- 主页
此应用的流程为:
这是我在代码中的设置:
main.dart
void main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider<StorageHelper>(create: (_) => StorageHelper()),ChangeNotifierProvider<AuthProvider>(create: (_) => AuthProvider()),],child: MyApp()));
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return Consumer<AuthProvider>(builder: (final BuildContext context,final AuthProvider authProvider,final Widget child) {
print(authProvider.isAuthenticated); // this is false whenever I //click the logout from category(or other pushed pages) but the below ternary //operation is not executing
return MaterialApp(
title: 'My Poor App',debugShowCheckedModeBanner: false,theme: ThemeData(
primaryColor: Color(0xff29c17e),visualDensity: VisualDensity.adaptivePlatformDensity,),home: authProvider.isAuthenticated ? HomeScreen() : LoginScreen(),onGenerateRoute: Router.onGenerateRoute,);
});
}
}
LoginScreen.dart
class LoginScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final authProvider = Provider.of<AuthProvider>(context,listen: false);
return Scaffold(
body: Center(
child: MaterialButton(
onpressed: () async {
await authProvider.emailLogin('user@email.com','pass');
},child: Text('Login'))),);
}
}
HomeScreen.dart
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthProvider>(context,listen: false);
return Scaffold(
body: Center(
child: MaterialButton(
elevation: 2,onpressed: () {
Navigator.push(
context,MaterialPageRoute(
builder: (context) => CategoryScreen()));
},child: Text('Reset')),);
}
}
AuthProvider.dart
class AuthProvider extends ChangeNotifier {
bool _isAuthenticated = false;
bool get isAuthenticated => _isAuthenticated;
set isAuthenticated(bool isAuth) {
_isAuthenticated = isAuth;
notifyListeners();
}
Future emailLogin(String email,String password) async {
isAuthenticated = true;
}
Future logout() async {
isAuthenticated = false;
}
}
如果我使用Provider.of<AuthProvider>(context).logout()
从主页注销,则工作正常。但是,如果我push
或pushReplacement
一条新路由并尝试从新路由注销(只是说我从首页导航到类别页面并尝试从那里注销),则不会重定向到LoginPage。如果我打印isAuthenticated
的值,它将打印false,但是使用者没有监听或至少没有对变量更改做出反应。
请不要将此问题标记为重复,我搜索了许多其他类似的问题,但没有一个适合我的情况。
编辑: CategoryScreen.dart
class CategoryScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
onpressed: () {
final auth = Provider.of<AuthProvider>(context,listen: false);
auth.logout();
// print(auth.isAuthenticated);
},child: Text('Category logout'),);
}
}
解决方法
我想您的问题是您没有在Consumer
的{{1}}中将logout
用作home
。看看,如果它对您有用
main.dart
MaterialApp
由于// needs to listen to the changes,to make changes
home: Consumer<AuthProvider>(
builder: (context,authProvider,child){
return authProvider.isAuthenticated ? HomeScreen() : LoginScreen();
}
)
不在您的Consumer
中,即使更改了值,它也无法按照提供程序为您更新视图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。