【问题标题】:Flutter app MultiProvider with StreamProviders that depends on eachotherFlutter 应用程序 Multi Provider 和相互依赖的 Stream Providers
【发布时间】:2020-11-15 06:25:41
【问题描述】:

在我的应用程序中,我在整个应用程序(整个 MaterialApp 上)上使用了一个 StreamProvider,它提供了用户的状态(无论他是否登录,如果他登录,他就是 uid)。我想为整个 MaterialApp 提供来自 Firebase 的实时 UserData,因此我需要在包装整个 MaterialApp 的 MultiProvider 中使用 StreamProvider。但问题是要从Firebase获取UserData,我需要获取用户的uid,所以我不能使用用户状态和uid的StreamProviders以及提供UserData的那个。 我的代码如下所示:

MultiProvider(
  providers: [
    StreamProvider.value(
      value: AuthService().getUser(),
    ),
    StreamProvider<UserData>.value(
      value: DatabaseRepository(uid: HERE I NEED THE UID FROM THE PREVIOUS PROVIDER).getUserDataStream(),
      child: Tabs(),
      catchError: (ctx, e) {
        print('error: $e');

        return UserData(
          uid: null,
          username: null,
          email: null,
        );
      },
    ),
  ],

我应该怎么做才能从第一个 StreamProvider 获取 uid 并在第二个 StreamProvider 中使用它来获取用户数据?

【问题讨论】:

  • 使用 ProxyProvider

标签: firebase flutter dart firebase-authentication provider


【解决方案1】:

我尝试了两种逻辑。在第一种模式的情况下,不幸的是我可以在 Tabs 类中获得“UserData”。但是第二种模式,效果很好。

/// 1st Pattern
MultiProvider(
    providers: [
        StreamProvider<User>.value(value: AuthService().getUser(),),
        ProxyProvider<User, StreamProvider<UserData>>(
            update: (context, value, previous) {
                return StreamProvider<UserData>.value(value: 
                    DatabaseRepository(uid:User.uid).getUserDataStream(),);
            }
        )
    ],
    child: Tabs(),
);

/// 2nd Pattern
MultiProvider(
    providers: [
        StreamProvider<User>.value(value: AuthService().getUser(),),
    ],
    child: Builder(
        builder: (context) {
            final user = Provider.of<User>(context);
            return MultiProvider(
                providers: [
                    StreamProvider<UserData>.value(value: 
                        DatabaseRepository(uid:user.uid).getUserDataStream(),)
                ],
                child: Tabs()
            ); 
        }
    )
);

【讨论】:

  • 对不起我的粗鲁类型。我更正了我的代码。
猜你喜欢
  • 2020-11-06
  • 2017-01-07
  • 2021-11-25
  • 1970-01-01
  • 2014-10-11
  • 2023-03-26
  • 2017-07-15
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多