我正在使用 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 的原因是监视更改并将它们实际反射(reflect)在您的应用程序上。这段代码:
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();
关于firebase - 这是检查用户是否登录的正确方法吗? flutter 火力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68673592/