首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何更新基于riverpods streamProvider的嵌套屏幕?

如何更新基于riverpods streamProvider的嵌套屏幕?
EN

Stack Overflow用户
提问于 2021-04-06 21:44:53
回答 1查看 224关注 0票数 0

想象一下有三个屏幕。main.dart,home.dart & signIn.dart我有代码,如下所示。当我在主屏幕中,streamProvider(firebaseAuthStateProvider)发生变化时,我会自动返回到main.dart屏幕。在此之后,if-query会将我直接送到signIn.dart屏幕。不出所料。但是,当我创建一个新的嵌套屏幕,并且streamProvider更改了它的值时,“根”屏幕(home.dart)不会将我返回到signIn屏幕。所以我认为它只适用于第一个孩子,而不适用于嵌套的孩子。

有没有可能只有一个查询来检查根屏幕中的streamProvider,或者我必须在每个屏幕中都放一个查询来检查值?

代码语言:javascript
代码运行次数:0
运行
复制
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();
      }
      //...
EN

回答 1

Stack Overflow用户

发布于 2021-04-06 22:10:15

只要最高的小部件是监听身份验证状态更改的小部件,所有的子部件都将受到屏幕更改的影响。下面的代码是我不久前在GitHub上找到的,在我所有的Flutter项目中都是我的goto。

AuthHome()是我的顶层小部件,它是应用程序其余部分的父部件

auth_home.dart:

代码语言:javascript
代码运行次数:0
运行
复制
class AuthHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AuthWidget(
          signedInBuilder: (context) => NavBase(),
          signedOutBuilder: (context) => Login());
  }
}

auth_widget.dart:

代码语言:javascript
代码运行次数:0
运行
复制
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()是应用程序的其余认证部分所在的位置

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66969879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档