如何解决FlutterFire如何使用onAuthStateChanges?
我想知道在Flutter网站中使用onAuthStateChanges的正确方法。
我的流程应为以下内容:
如果用户已登录,则:
- 如果该页面是登录页面,则应重定向到首页;
- 如果该页面是除登录页面以外的任何其他页面,则应保留在该页面上;
如果用户未登录,则:
- 如果该页面是登录页面,则应保留在该页面上;
- 如果该页面不是登录页面,则应在登录页面上重定向:
我已经创建了身份验证服务,并添加了以下功能:
void listenToAuthChanges(Function onNotLoggedIn,Function onLoggedIn) {
FirebaseAuth.instance.authStateChanges().listen((firebaseUser) {
if (firebaseUser == null){
onNotLoggedIn();
}else{
onLoggedIn();
}
然后在main.dart文件的main()函数中,添加以下内容:
Future<void> main() async {
setupLocator();
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
var authService = locator<AuthenticationService>();
var navigationService = locator<NavigationService>();
authService.listenToAuthChanges(
() => {navigationService.pushNamedAndRemoveUntil(Routes.login)},() => {navigationService.pushNamedAndRemoveUntil(Routes.homePage)});
runApp(MyApp());
}
如果我已登录并且登录到登录页面,则此实现有效,但是无论我处于哪个页面,它都会将我重定向到首页(这是我实现的第二个功能)。
我的目标是仅在我未登录且位于登录页面时才重定向到主页。
因此,我更改了实现,删除了此功能,并将其添加到登录页面的initialize函数中(我使用的是与Provider体系结构堆叠在一起的包),这样仅当我在登录页面上时才调用它
以下是我的实现:
Future<void> main() async {
setupLocator();
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
var authService = locator<AuthenticationService>();
var navigationService = locator<NavigationService>();
authService.listenToAuthChanges(
() => {navigationService.pushNamedAndRemoveUntil(Routes.login)},() => {);
runApp(MyApp());
}
在我的loginviewmodel.dart内部,我具有此功能,只有在登录页面被调用时才应调用该功能:
Future<void> initialise() async {
bool loggedIn = await authenticationService.isUserLoggedIn();
if (loggedIn) {
navigationService.pushNamedAndRemoveUntil(Routes.homePage);
}
}
isUserLoggedIn()函数是一个实用程序函数,如果auth.currentUser不为null,则返回true,否则返回false。
这里的问题是,尽管此函数位于登录页面内部,但始终重定向,即使我在其他页面上进行重定向,其行为也与以前相同。
我的问题是两个:
- 您如何处理Flutter Web中的onAuthStateChanges?
- 当我键入Web应用程序的URL时,无论我叫什么页面,路由页面(在我的情况下为登录页面)是否总是被称为?
非常感谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。