这是检查用户是否登录的正确方法吗?颤动火力基地

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)

Hut*_*yad 7

使用 Streambuilder 的原因是监视更改并将其实际反映在您的应用程序上。这段代码:

FirebaseAuth.instance.currentUser == null
              ? Routes.loginScreen
              : Routes.homePage,
Run Code Online (Sandbox Code Playgroud)

可以正常工作,但只有一次,当您的应用程序运行时。仅当您的应用程序到达该代码行时,它才会捕获身份验证状态。但是,如果之后用户退出,应用程序 UI 不会更改,这就是使用流的额外好处。如果您的应用程序中的任何位置添加了注销按钮,您的用户确实会注销,但仍会在您的应用程序内。将不会返回登录屏幕。

由于您使用的是 FirebaseAuth SDK,建议充分利用它,因为它带有内置流,例如idTokenChanges authStateChangesuserChanges,它们将使您的生活变得更加轻松,并且您的应用程序代码更加优雅。

如果您想保持这样的代码,那没问题,但请确保在您的登录屏幕路由中,您有一个流,它侦听身份验证更改和类似于以下内容的伪代码:

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)

  • @venir Streambuilders 非常高效,并且功耗非常低,您可以在 devTools 中进行研究。但说到这样的事情,即使有点“贵”,但对于应用程序如此重要的转折点来说,也是值得的。我有一个应用程序,其中一个名为“isBlocked”的布尔值存储在我的用户文档中。当管理员阻止用户时,会触发应用程序深处的单独流,并将用户注销,这会将用户重定向到登录并向他们显示一条被阻止的消息。许多使用流的有用的动态案例。 (2认同)
  • 除了 flutter 团队和 firebase 团队根据他们的文档推荐这一事实,并且 firebase 团队为实现我的答案中提到的多个流付出了大量努力之外,这种协作努力是有原因的,而且它'阅读有关它们的内容会非常有趣。你会喜欢它的。 (2认同)