Flutter 热重新加载时,登录屏幕路径优先于任何其他路径

Flutter 热重新加载时,登录屏幕路径优先于任何其他路径,flutter,firebase-authentication,state-management,Flutter,Firebase Authentication,State Management,我使用firebase进行身份验证,为了了解用户当前状态,我在流函数中使用authStateChanges函数,它工作正常,但当用户登录时,它首先进入登录屏幕几秒钟,然后进入用户/主页。。我不明白为什么它会先进入登录屏幕!!它不会停留在那里,但它会先到达那里,然后打开我的主页 这是我的密码: 主飞镖 void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { // This widget is the r

我使用firebase进行身份验证,为了了解用户当前状态,我在流函数中使用authStateChanges函数,它工作正常,但当用户登录时,它首先进入登录屏幕几秒钟,然后进入用户/主页。。我不明白为什么它会先进入登录屏幕!!它不会停留在那里,但它会先到达那里,然后打开我的主页

这是我的密码:

主飞镖

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: landingpage(),
    );
  }
}
飞镖

class landingpage extends StatelessWidget {
  final Future<FirebaseApp> _initialization = Firebase.initializeApp();
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _initialization,
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Scaffold(
              body: Text('Error: ${snapshot.error}'),
            );
          }
          if (snapshot.connectionState == ConnectionState.done) {
            return MultiProvider(
              providers: [
                ChangeNotifierProvider<ModalHudState>(
                  create: (context) => ModalHudState(),
                ),
                ChangeNotifierProvider<AdminMode>(
                  create: (context) => AdminMode(),
                ),
                StreamProvider.value(value: Auth().user),
              ],
              child: MaterialApp(
                initialRoute: Wrapper.id,
                routes: routes,
              ),
            );
          }
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        });
  }
}

authStateChanges
不会在启动应用程序时立即发出数据。Firebase Auth SDK可能需要一些时间才能确定当前用户是否有效。有时,这涉及到发出网络请求,这可能需要很长时间


如果您想避免所观察到的问题,您的代码应该显示某种启动屏幕或加载指示器,直到auth状态指示确实有用户登录或未登录。

随着Doug Stevenson的更改,authStateChanges在提取时不会返回空对象。它给出了一个未来的目标。您可以将等待函数与加载小部件一起使用。按照下面的答案做

在主体中,使其成为一个堆栈。让第一个子部件成为您的主小部件,然后下一个子部件成为中心小部件,其子部件是这样的“加载小部件”

Stack(
 children:[Container(),
  Center(
   child:isLoading?Loading():Container()   
)]
)
setState((){
isLoading = true
})
await {Your authentication stuff}
setState((){
isLoading = false
})
定义isLoading布尔变量并将其声明为false。每当您需要暂停以进行身份验证时,请这样写

Stack(
 children:[Container(),
  Center(
   child:isLoading?Loading():Container()   
)]
)
setState((){
isLoading = true
})
await {Your authentication stuff}
setState((){
isLoading = false
})

加载小部件可以是您的启动屏幕。

太好了!!你能指导我如何实现这样一种方法吗!我建议你自己尝试一下,如果你的新代码没有按照你期望的方式工作,那么就发布一个新问题。
setState((){
isLoading = true
})
await {Your authentication stuff}
setState((){
isLoading = false
})