我的应用程序的用户需要进行身份验证。身份验证状态由提供程序类跟踪。登录功能运行良好,但是,用户也可以注销,这会带来问题。
在main.dart中,我使用一个消费者小部件来跟踪身份验证状态:
child: Consumer<AuthenticationProvider>(
builder: (ctx, auth, child) => MaterialApp(
title: 'FlutterChat',
home: auth.isAuth
? WelcomeScreen()
: FutureBuilder(
future: auth.tryAutoLogin(),
builder: (ctx, authResultSnapshot) =>
authResultSnapshot.connectionState ==
ConnectionState.waiting
? SplashScreen()
: AuthFlowScreen(),
),
),
),
在应用程序启动时,消费者将检查身份验证状态,如果用户未通过身份验证,则用户将被重定向到AuthFlowScreen,否则用户将看到WelcomeScreen。如果用户遵循AuthFlowScreen并成功进行身份验证,则用户将自动转到WelcomeScreen,因为消费者就是这样做的。
WelcomeScreen有一个导航栏,用户可以从中导航到应用程序的其他部分。导航栏还有一个注销按钮。按下此按钮时,main.dart文件中的使用者需要做出反应。只要用户没有导航到任何其他屏幕,注销就可以工作,AuthFlowScreen就会显示给用户。但是,如果用户导航到应用程序中的其他部分,则不会发生这种情况。
导航发生在:
Navigator.push(context, MaterialPageRoute(builder: (context) {
return ChatOverviewScreen();
}))
注销脚本:
void logout() {
_auth.signOut();
_userEmail = null;
_userId = null;
notifyListeners();
}
导航似乎扰乱了main.dart文件中的消费者,然而,我如何在应用程序中导航,以便main.dart中的消费者仍在工作。
为了让登录系统更好地使用集团状态管理,您可以在这里找到完整的示例:https://bloclibrary.dev/#/flutterlogintutorial