如何在flutter中拥有多个app-wise流,当一个流依赖于另一个流时?

问题描述 投票:0回答:1

我有两个流,我需要使用其数据的应用程序。

我的主要障碍是,其中一个流需要另一个流的数据,因此,我不能调用一个 MultiProvider.

我现在的实现看起来是这样的,但是我不喜欢这样。我认为返回多个MaterialApps是不行的。实际上,当从一个MaterialApp切换到另一个MaterialApp时,我的应用程序会暂时变黑。

这是我目前的实现。

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return StreamProvider<User>.value( //First, listen to the User Stream here
      value: AuthService().user,
      child: MyMaterialApp(),
    );
  }
}


class MyMaterialApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context); //To get the user data here, and use it bellow

    if (user == null){ //If I don't have the User yet, return Loading()
      return MaterialApp(
        debugShowCheckedModeBanner: false,
        title: "myApp",
        theme: myTheme(),
        home: Loading(),
      );
    } else {
      return StreamProvider<UserData>.value(
        value: DatabaseService(uid: user.uid).userData, //Once I have it, use it to build the UserData Stream
        child: MaterialApp(
            debugShowCheckedModeBanner: false,
            title: "myApp",
            theme: myTheme(),

            home: Wrapper(),
            initialRoute: '/',
            routes: {
              '/home': (context) => Wrapper(),
              //...
            }
        ),
      );
    }
  }
}

谢谢你!

firebase flutter dart stream
1个回答
0
投票

基于这个帖子 https:/github.comrrousselGitproviderissues222。 我是通过以下方式来解决的。

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

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<User>.value(value: AuthService().user),
        Consumer<User>(
          builder: (context, user, child) => StreamProvider<UserData>.value(
            value: DatabaseService(uid: user == null ? null : user.uid).userData,
            child: child,
          ),
        )
      ],
      child: MaterialApp(
          debugShowCheckedModeBanner: false,
          title: "myApp",
          theme: myTheme(),

          home: Wrapper(),
          initialRoute: '/',
          routes: {
            '/home': (context) => Wrapper(),
            //...
          }
      ),
    );
  }
}

这个... Consumer 监听用户数据并将其传递给下一个流。

© www.soinside.com 2019 - 2024. All rights reserved.