Flutter 热重新加载时,登录屏幕路径优先于任何其他路径
我使用firebase进行身份验证,为了了解用户当前状态,我在流函数中使用authStateChanges函数,它工作正常,但当用户登录时,它首先进入登录屏幕几秒钟,然后进入用户/主页。。我不明白为什么它会先进入登录屏幕!!它不会停留在那里,但它会先到达那里,然后打开我的主页 这是我的密码: 主飞镖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
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
})