应用不记得用户已登录



我目前设法完成了我的web应用程序,并尝试制作它,这样用户就不必每次访问该应用程序时都登录。这在调试模式下有效,但一旦我使用firebase将其部署到实际的web上,每次刷新应用程序时,它都会要求您再次登录。我试着使用Future构建器来做这件事,甚至检查当前用户。所有的东西都可以在调试中工作,但在真实的网站上不起作用。

代码:

class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData.dark(),
scrollBehavior: ScrollConfiguration.of(context).copyWith(dragDevices: {
PointerDeviceKind.mouse,
PointerDeviceKind.touch,
}),
home: FirebaseAuth.instance.currentUser != null ? Homepage() : Login());
}
}

Firebase会自动将用户凭据保存在本地存储中,并在页面重新加载时恢复这些凭据。这需要它调用服务器,检查帐户是否已被禁用。

虽然这个对服务器的调用是在currentUser上进行的,但它是null,这就是为什么您的代码在加载时会将用户发送到登录页。当来自服务器的调用完成/返回时,Firebase会更新currentUser,但此时不会重新触发渲染代码。


您要做的是监听authStateChanges()流,如身份验证状态文档中所示。通过将其放在StreamBuilder中,您的UI将响应身份验证状态的更改。有关此方面的一些示例,请参阅如何在Flutter中管理Firebase身份验证状态?


使用这种方法,UI可能会短暂显示登录页面(在调用服务器期间(,然后在状态恢复后显示正确的页面。如果你想阻止这短暂的闪光,你知道androloper在他们的回答中做了什么。除了监听authStateChanges之外,只需确保执行,因为只检查本地状态意味着您错过了服务器拒绝存储凭据的情况。

我遇到过这个问题。我还没有使用谷歌firebase,但它是关于检查令牌。也许这个能帮你搞定。首先,你应该创造未来,例如:

Future<bool> autoLogin() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool accessToken = prefs.containsKey('accessToken');
return accessToken;
}

然后你这样称呼它:

home: FutureBuilder<bool>(
future: autoLogin(),
builder: (context, snapshot){
if(snapshot.data == null){
return SplashScreen();
}else {
return snapshot.data == true ? WantedToGoScreen() : LoginScreen();
}
},
),

只需使用共享首选项来存储标识该状态的任何值。。。然后在注销时删除Preference键。。。

因此,当应用程序开始检查存储值是否存在时。。如果存在,则其已记录,否则已注销。。。

最新更新