Firebase 具有相互依赖的StreamProvider的Flatter应用程序多供应商

Firebase 具有相互依赖的StreamProvider的Flatter应用程序多供应商,firebase,flutter,dart,firebase-authentication,provider,Firebase,Flutter,Dart,Firebase Authentication,Provider,在我的应用程序中,我在整个应用程序(在整个MaterialApp上)上使用StreamProvider,它提供用户的状态(无论他是否登录,如果他登录了,他就是uid)。我想为整个MaterialApp提供来自Firebase的实时用户数据,因此我需要在包装整个MaterialApp的多提供者中使用StreamProvider。但问题是,要从Firebase获取UserData,我需要获取用户的uid,因此我不能使用用户状态和uid的StreamProviders以及提供UserData的Stre

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

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,
        );
      },
    ),
  ],
MultiProvider(
供应商:[
StreamProvider.value(
值:AuthService().getUser(),
),
StreamProvider.value(
值:DatabaseRepository(uid:这里我需要来自上一个提供程序的uid)。getUserDataStream(),
子项:制表符(),
捕捉错误:(ctx,e){
打印('error:$e');
返回用户数据(
uid:null,
用户名:null,
电子邮件:空,
);
},
),
],

如何从第一个StreamProvider获取uid并在第二个StreamProvider中使用它来获取用户数据?

我尝试了两种逻辑。对于第一种模式,不幸的是,我可以在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()
            ); 
        }
    )
);
///第一个模式
多供应商(
供应商:[
StreamProvider.value(值:AuthService().getUser(),),
代理提供者(
更新:(上下文、值、上一个){
返回StreamProvider.value(值:
DatabaseRepository(uid:User.uid).getUserDataStream(),);
}
)
],
子项:制表符(),
);
///第二种模式
多供应商(
供应商:[
StreamProvider.value(值:AuthService().getUser(),),
],
孩子:建筑工人(
生成器:(上下文){
最终用户=提供者(上下文);
回程多供应商(
供应商:[
StreamProvider.value(值:
数据库存储库(uid:user.uid).getUserDataStream(),)
],
子项:制表符()
); 
}
)
);

我尝试了两种逻辑。在第一种模式中,不幸的是,我可以在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()
            ); 
        }
    )
);
///第一个模式
多供应商(
供应商:[
StreamProvider.value(值:AuthService().getUser(),),
代理提供者(
更新:(上下文、值、上一个){
返回StreamProvider.value(值:
DatabaseRepository(uid:User.uid).getUserDataStream(),);
}
)
],
子项:制表符(),
);
///第二种模式
多供应商(
供应商:[
StreamProvider.value(值:AuthService().getUser(),),
],
孩子:建筑工人(
生成器:(上下文){
最终用户=提供者(上下文);
回程多供应商(
供应商:[
StreamProvider.value(值:
数据库存储库(uid:user.uid).getUserDataStream(),)
],
子项:制表符()
); 
}
)
);

使用ProxyProvider使用ProxyProvider请更正您的代码,键入的错误太多。对不起,我键入的错误太多。我更正了我的代码。请更正您的代码,键入的错误太多。对不起,我键入的错误太多。我更正了我的代码。