gpt4 book ai didi

flutter - 将两个 Streams 合并为一个 StreamProvider

转载 作者:行者123 更新时间:2023-12-03 03:59:36 26 4
gpt4 key购买 nike

我有两个流:

  • 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 流,而且我不知道如何将它们组合成一个 Provider。

最佳答案

所以这似乎工作正常:

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

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

感谢pskink有关 flatMap 的提示.

关于flutter - 将两个 Streams 合并为一个 StreamProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58259649/

26 4 0