用户/logIn/logOut屏幕中的Flutter混淆行为



最近我一直在努力解决这个问题。我不理解这里的颤动行为。

我正在尝试创建一个用户/登录/注册页面。为此,我使用了Firebase cloud firestore和Firebase Auth。我有一个存储用户状态的提供商

enum Status { Uninitialized, Authenticated, Authenticating, Unauthenticated, Register, AuthenticatingRegister, RegisterTransit, RegisterNS, AuthenticatingRegisterNS }
class UserRepository with ChangeNotifier {
FirebaseAuth _auth;
FirebaseUser _user;
Status _status = Status.Uninitialized;

这就是我实现SignIn函数的方式。SingUp和LogIn-LogOut非常相似。

Future<bool> signIn(String email, String password) async {
try {
_status = Status.Authenticating;
notifyListeners();
await _auth.signInWithEmailAndPassword(email: email, password: password, );
return true;
} catch (e) {
_status = Status.Unauthenticated;
notifyListeners();
return false;
}
} 

当我根据状态选择要显示的屏幕时,我有我的用户屏幕。

class UserScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => UserRepository.instance(),
child: Consumer(
builder: (context, UserRepository user, _) {
switch (user.status) {
case Status.RegisterNS:
case Status.AuthenticatingRegisterNS:
return FormNS();
case Status.RegisterTransit:
return LoginMeio();
case Status.Unauthenticated:
case Status.Authenticating:
return LoginPage();
case Status.Authenticated:
return UserInfoPage(user: user.user);
case Status.Register:
case Status.AuthenticatingRegister:
return RegisterScreen();
case Status.Uninitialized:
return Splash();
default:
return Splash();
}
},
),
);
}
}

我正在取消底部选项卡导航器的标签,以便在应用程序中导航。

一切都按预期进行,只是一件小事的一部分。我正在UserRepository提供程序上将"状态"初始化为"未初始化"。每次打开UserScreen,在重定向到正确的屏幕之前,都会显示启动屏幕。这对于用户第一次想要导航到UserScreen来说是完美的。但在那之后,我只想直接打开正确的页面,而不需要通过飞溅屏幕。

如果我不够清楚,请告诉我。

我的问题是。如果我转到一个页面并返回到用户屏幕,我如何防止状态被初始化为状态。在它识别出正确的状态并返回正确的页面之前取消初始化?

要登录用户,请调用以下命令:

await _auth.signInWithEmailAndPassword(email: email, password: password, );

正如await的使用已经表明的那样,此操作是异步的:Firebase需要在此处调用其身份验证服务器,以检查电子邮件和密码组合,这需要一些时间。

此呼叫所需的时间取决于许多因素。虽然这对你来说可能很快,但对于你的一些用户来说,如果他们在更偏远的地方,或者互联网连接速度较慢,可能需要几秒钟的时间。

但事实上,非常简短地显示一个启动屏幕也不是一个很好的用户体验,所以你有几个选项我可以想到:

  1. 首先,我会考虑是否每次都需要登录用户。Firebase身份验证会自动保持用户身份验证状态,并在用户重新启动应用程序时恢复该状态。因此,与其每次调用signInWithEmailAndPassword,不如考虑使用await _auth.currentUser()

    不幸的是,这也是一个异步操作,因为Firebase需要检查用户的ID令牌是否仍然有效(刷新则不然(。但是它可能比调用signInWithEmailAndPassword花费的时间更少。

  2. 您可以保留一个本地标志(例如在共享首选项中(,用于标记用户以前登录过,并使用该标志跳过启动屏幕。请注意,用户的登录可能已经过期或失败,因此您的乐观假设(基于本地标志(可能是错误的,在这种情况下,您可能仍然希望显示启动屏幕。

  3. 您可以将启动屏幕的显示延迟一小段时间,以防止大部分闪烁。假设您注意到重新身份验证平均耗时不到0.5秒。您可以将代码更改为仅在0.5秒后显示启动屏幕,以确保用户不会看到,除非它花费的时间超过0.5秒。

    它的有效性以及使用的确切截止点取决于所有用户登录所需时间的分布。因此,您可能需要开始使用Firebase Analytics或Performance Monitoring等工具跟踪用户登录所需的时间。

相关内容

  • 没有找到相关文章

最新更新