Flutter:为什么每次我重新启动我的应用程序时登录页面都会在进入主屏幕之前短暂出现,尽管用户已经登录?
Flutter : Why does the login page appear briefly before going to home screen every time I restart my app although the user is already logged in?
Flutter & Firebase:为什么每次我重新启动我的应用程序时,登录页面总是在进入主屏幕之前短暂出现,即使用户已经登录?
我知道我的应用有时需要从 firebase 呈现用户。但是用户已经登录了。那么,既然用户已经登录,我该如何立即进入主屏幕呢?有没有办法将用户数据保存到phone内存中?
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
final user = Provider.of<SystemUser>(context);
if (user == null) {
print('In Authenicate or Login');
return Authenticate();
} else {
print('In HomeScreen');
return NavigationWrapper(); // goto homescreen
}
}
}
请大家看看,指点一下
您可以在 shared preferences 中保存用户身份验证状态,但即使在这种情况下,您也需要在导航到身份验证屏幕或主屏幕之前加载一些数据。
我建议您使用以下解决方案。这样就加载了auth状态,然后根据auth状态导航到相应的页面。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: Provider.of<SystemUser>(context).isAuthenticate(),
builder: (context, snapshot) {
// while loading data
if (snapshot.data == null) {
return CircularProgressIndicator();
}
// if has error
if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
// retrieve data - check for authentication
// authenticated, go to homescreen
if (snapshot.data == true) {
print('In HomeScreen');
return NavigationWrapper();
}
// not authenticated, go to auth screen
print('In Authenicate or Login');
return Authenticate();
},
);
}
}
// in SystemUser provider
// check for auth state and return corresponding value
Future<bool> isAuthenticate() async {
// you can implement shared prefereces
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('authKey') ?? false;
}
// whenever you logged in the user just call
prefs.setString('authKey', true);
我建议您使用 StreamBuilder 来检查用户是否已登录,如下所示:
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, AsyncSnapshot<User> snapshot) {
if(snapshot.connectionState == ConnectionState.waiting)
return Center(child: CupertinoActivityIndicator());
else if(!snapshot.hasData || snapshot.data == null)
return LoginPage();
else if (snapshot.hasError)
return Center(child: Text('${snapshot.error}'));
return HomePage();
},
);
}
}
我在每个需要FirebaseAuth的项目中都是这样使用的,希望对你有帮助。
您可以使用 Consumer
元素执行以下操作。
安装 flutter 的 Provider
包并制作一个 bool isAuth
。当用户登录时,设置 isAuth = true
,然后在 home:
中添加一个 if 语句,就像我提供的图像一样。希望这能解决您的问题。
Flutter & Firebase:为什么每次我重新启动我的应用程序时,登录页面总是在进入主屏幕之前短暂出现,即使用户已经登录?
我知道我的应用有时需要从 firebase 呈现用户。但是用户已经登录了。那么,既然用户已经登录,我该如何立即进入主屏幕呢?有没有办法将用户数据保存到phone内存中?
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
final user = Provider.of<SystemUser>(context);
if (user == null) {
print('In Authenicate or Login');
return Authenticate();
} else {
print('In HomeScreen');
return NavigationWrapper(); // goto homescreen
}
}
}
请大家看看,指点一下
您可以在 shared preferences 中保存用户身份验证状态,但即使在这种情况下,您也需要在导航到身份验证屏幕或主屏幕之前加载一些数据。
我建议您使用以下解决方案。这样就加载了auth状态,然后根据auth状态导航到相应的页面。
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
class _WrapperState extends State<Wrapper> {
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: Provider.of<SystemUser>(context).isAuthenticate(),
builder: (context, snapshot) {
// while loading data
if (snapshot.data == null) {
return CircularProgressIndicator();
}
// if has error
if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
// retrieve data - check for authentication
// authenticated, go to homescreen
if (snapshot.data == true) {
print('In HomeScreen');
return NavigationWrapper();
}
// not authenticated, go to auth screen
print('In Authenicate or Login');
return Authenticate();
},
);
}
}
// in SystemUser provider
// check for auth state and return corresponding value
Future<bool> isAuthenticate() async {
// you can implement shared prefereces
SharedPreferences prefs = await SharedPreferences.getInstance();
return prefs.getString('authKey') ?? false;
}
// whenever you logged in the user just call
prefs.setString('authKey', true);
我建议您使用 StreamBuilder 来检查用户是否已登录,如下所示:
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, AsyncSnapshot<User> snapshot) {
if(snapshot.connectionState == ConnectionState.waiting)
return Center(child: CupertinoActivityIndicator());
else if(!snapshot.hasData || snapshot.data == null)
return LoginPage();
else if (snapshot.hasError)
return Center(child: Text('${snapshot.error}'));
return HomePage();
},
);
}
}
我在每个需要FirebaseAuth的项目中都是这样使用的,希望对你有帮助。
您可以使用 Consumer
元素执行以下操作。
安装 flutter 的 Provider
包并制作一个 bool isAuth
。当用户登录时,设置 isAuth = true
,然后在 home:
中添加一个 if 语句,就像我提供的图像一样。希望这能解决您的问题。