我使用Firebase在我的应用程序中添加登录/注册。它是完美的工作,但现在我想检查如果用户已经注册并登录时,他打开应用程序,如果是真的,然后显示他的主页,否则显示他的登录页面。所以我做了一些搜索,主要是使用Streambuilder方法完成的。但是我所做的只是检查用户是否使用
登录initialRoute: FirebaseAuth.instance.currentUser == null
? Routes.loginScreen
: Routes.homePage,
并且它工作得很完美,几乎每个人都在使用Streambuilder方法。所以我很好奇我是不是做错了?有更好的方法吗?这里是完整的代码。这是正常工作,但我只是想知道这是正确的方式?
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return Center(
child: CircularProgressIndicator(),
//Todo Add splashscreen
);
}
return MaterialApp(
debugShowCheckedModeBanner: false,
title: "MyApp",
initialRoute: FirebaseAuth.instance.currentUser == null
? Routes.loginScreen
: Routes.homePage,
onGenerateRoute: Routes.generateRoute,
);
},
);
}
}
使用streambuilder的原因是监视更改并实际反映到您的应用程序中。
FirebaseAuth.instance.currentUser == null
? Routes.loginScreen
: Routes.homePage,
工作正常,但只有一次,当你的应用程序运行。只有当你的应用程序到达那行代码时,它才会捕获授权状态。但如果用户退出后,应用程序UI不会改变,这就是使用流的额外好处所在。如果在你的应用程序的任何地方,你添加了一个注销按钮,你的用户确实会注销,但仍将在你的应用程序内。登录屏幕将不会返回。
既然你正在使用FirebaseAuth SDK,建议充分利用它,因为它带有内置流,如idTokenChanges
,authStateChanges
和userChanges
,它们将使你的生活更轻松,你的应用程序代码更优雅。
如果你想保持你的代码像这样,这是好的,但要确保在你的loginScreen路由,你有一个流,监听Auth更改和伪代码类似于这样的东西:
StreamBuilder<User?>(
stream: FirebaseAuth.instance.userChanges(),
initialData: FirebaseAuth.instance.currentUser,
...etc
if (snapshot.data == null)
return LoginScreenLogicWithButtons());
if (snapshot.data != null)
return HomePage();