想象一下有三个屏幕。main.dart,home.dart & signIn.dart我有代码,如下所示。当我在主屏幕中,streamProvider(firebaseAuthStateProvider)发生变化时,我会自动返回到main.dart屏幕。在此之后,if-query会将我直接送到signIn.dart屏幕。不出所料。但是,当我创建一个新的嵌套屏幕,并且streamProvider更改了它的值时,“根”屏幕(home.dart)不会将我返回到signIn屏幕。所以我认为它只适用于第一个孩子,而不适用于嵌套的孩子。
有没有可能只有一个查询来检查根屏幕中的streamProvider,或者我必须在每个屏幕中都放一个查询来检查值?
class SignInCheck extends ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader scopedReader) {
final _authState = scopedReader(firebaseAuthStateProvider); //
return _authState.when(data: (value) {
if (value != null) {
return HomeScreen();
} else {
return SignIn();
}
//...
发布于 2021-04-06 14:10:15
只要最高的小部件是监听身份验证状态更改的小部件,所有的子部件都将受到屏幕更改的影响。下面的代码是我不久前在GitHub上找到的,在我所有的Flutter项目中都是我的goto。
AuthHome()
是我的顶层小部件,它是应用程序其余部分的父部件
auth_home.dart:
class AuthHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return AuthWidget(
signedInBuilder: (context) => NavBase(),
signedOutBuilder: (context) => Login());
}
}
auth_widget.dart:
class AuthWidget extends ConsumerWidget {
AuthWidget(
{required this.signedInBuilder,
required this.signedOutBuilder});
final WidgetBuilder signedInBuilder;
final WidgetBuilder signedOutBuilder;
@override
Widget build(BuildContext context, watch) {
final authStateChanges = watch(authStateChangesProvider);
return authStateChanges.when(
data: (user) => _data(context, user),
loading: () => const Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
),
error: (err, __) {
print(err);
return Scaffold(
body: EmptyContent(
title: 'Something went wrong',
message: 'Can\'t load data right now.',
),
);
},
);
}
Widget _data(BuildContext context, User? user) {
if (user != null) {
return signedInBuilder(context);
}
return signedOutBuilder(context);
}
}
其中NavBase()
是应用程序的其余认证部分所在的位置
https://stackoverflow.com/questions/66969879
复制相似问题