Flutter Provider:提供 2 个流,一个依赖于另一个

Isa*_*aak 10 provider stream dart flutter

我正在使用提供程序包。在小部件树的根部,我有一个 multiprovider:

Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<FirebaseUser>.value(
            value: FirebaseConnection.getAuthenticationStream()),
        StreamProvider<User>.value(
            value: FirebaseConnection.getUserStream(uid: ???))
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        initialRoute: LoginScreen.id,
        onGenerateRoute: RouteGenerator.generateRoute,
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

第一个 StreamProvider 提供来自 firebase_auth 的登录用户。第二个 StreamProvider 应该向该用户提供附加信息(存储在 users 集合中)。问题是要获得第二个流,我需要第一个流提供的 FirebaseUser 的 uid,但我不知道如何访问它。

嵌套 StreamProviders 不起作用,因为在第二个流中我只能访问构建方法的(错误)上下文(对于 Provider.of(context))

Isa*_*aak 3

解决方案是将第二个流 (loggedInUserStream) 保存在状态中,并在第一个流 (authenticationStream) 发出新值(通过监听它)时更改它,如下面的代码所示:

class _FloatState extends State<Float> {
  StreamSubscription<FirebaseUser> authenticationStreamSubscription;
  Stream<User> loggedInUserStream;

  StreamSubscription<FirebaseUser> setLoggedInUserStream() {
    authenticationStreamSubscription =
        FirebaseConnection.getAuthenticationStream().listen((firebaseUser) {
      loggedInUserStream =
          FirebaseConnection.getUserStream(uid: firebaseUser?.uid);
    });
  }

  @override
  void initState() {
    super.initState();
    authenticationStreamSubscription = setLoggedInUserStream();
  }

  @override
  void dispose() {
    super.dispose();
    authenticationStreamSubscription.cancel();
  }

  @override
  Widget build(BuildContext context) {
    return StreamProvider<User>.value(
      value: loggedInUserStream,
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        initialRoute: LoginScreen.id,
        onGenerateRoute: RouteGenerator.generateRoute,
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我只需要第一个流 (authenticationStream) 来获取第二个流 (loggedInUserStream),因此我没有将其提供给下面的小部件。