将两个 Stream 合并为一个 StreamProvider

2024-01-13

我有两个流:

  • Stream<FirebaseUser> FirebaseAuth.instance.onAuthStateChanged
  • Stream<User> userService.streamUser(String uid)

我的 userService 需要经过身份验证的 FirebaseUser uid 作为参数。

由于我可能需要在应用程序的多个部分访问streamUser()流,因此我希望它成为我项目根部的提供者。

这就是我的 main.dart 的样子:

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  Widget build(BuildContext context) {
    var auth = FirebaseAuth.instance;
    var userService = new UserService();
    return MultiProvider(
      providers: [
        Provider<UserService>.value(
          value: userService,
        ),
      ],
      child: MaterialApp(
        home: StreamBuilder<FirebaseUser>(
            stream: auth.onAuthStateChanged,
            builder: (context, snapshot) {
              if (!snapshot.hasData) return LoginPage();
              return StreamProvider<User>.value(
                value: userService.streamUser(snapshot.data.uid),
                child: HomePage(),
              );
            }),
      ),
    );
  }
}

问题是,当我导航到不同的页面时,MaterialApp 下面的所有内容都会更改,并且我会丢失 StreamProvider 的上下文。

有没有办法将 StreamProvider 添加到 MultiProvider 提供程序列表中? 因为当我尝试时,我还必须为 FirebaseUser 创建另一个 onAuthStateChanged 流,并且我不知道如何将它们组合到一个提供程序中。


所以这似乎工作正常:

StreamProvider<User>.value(
  value: auth.onAuthStateChanged.transform(
    FlatMapStreamTransformer<FirebaseUser, User>(
      (firebaseUser) => userService.streamUser(firebaseUser.uid),
    ),
  ),
),

如果有人在某些边缘情况下对此有疑问,请告诉我。

谢谢pskink https://stackoverflow.com/users/2252830/pskink有关提示flatMap https://pub.dev/documentation/rxdart/latest/rx/Observable/flatMap.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将两个 Stream 合并为一个 StreamProvider 的相关文章

随机推荐