sae*_*han 5 firebase firebase-authentication flutter
我正在使用 Firebase 在我的应用程序中添加登录/注册。它工作完美,但现在我想检查用户在打开应用程序时是否已经注册并登录,如果是这样,则向他显示主页,否则向他显示登录页面。所以我做了一些搜索,大部分是使用 Streambuilder 方法完成的。但我所做的只是检查用户是否使用登录
initialRoute: FirebaseAuth.instance.currentUser == null
? Routes.loginScreen
: Routes.homePage,
Run Code Online (Sandbox Code Playgroud)
而且效果非常好,几乎每个人都在使用 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,
);
},
);
}
}
Run Code Online (Sandbox Code Playgroud)
使用 Streambuilder 的原因是监视更改并将其实际反映在您的应用程序上。这段代码:
FirebaseAuth.instance.currentUser == null
? Routes.loginScreen
: Routes.homePage,
Run Code Online (Sandbox Code Playgroud)
可以正常工作,但只有一次,当您的应用程序运行时。仅当您的应用程序到达该代码行时,它才会捕获身份验证状态。但是,如果之后用户退出,应用程序 UI 不会更改,这就是使用流的额外好处。如果您的应用程序中的任何位置添加了注销按钮,您的用户确实会注销,但仍会在您的应用程序内。将不会返回登录屏幕。
由于您使用的是 FirebaseAuth SDK,建议充分利用它,因为它带有内置流,例如idTokenChanges 、authStateChanges和userChanges,它们将使您的生活变得更加轻松,并且您的应用程序代码更加优雅。
如果您想保持这样的代码,那没问题,但请确保在您的登录屏幕路由中,您有一个流,它侦听身份验证更改和类似于以下内容的伪代码:
StreamBuilder<User?>(
stream: FirebaseAuth.instance.userChanges(),
initialData: FirebaseAuth.instance.currentUser,
...etc
if (snapshot.data == null)
return LoginScreenLogicWithButtons());
if (snapshot.data != null)
return HomePage();
Run Code Online (Sandbox Code Playgroud)