【问题标题】:How to have multiple app-wise streams in flutter, when one stream depends on the other?当一个流依赖于另一个流时,如何在颤动中拥有多个应用程序流?
【发布时间】:2020-09-29 07:04:13
【问题描述】:

我有两个流,我需要在应用方面使用它们的数据。

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

我当前的实现如下所示,但我不喜欢它:我认为返回多个 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】:

    根据这篇帖子https://github.com/rrousselGit/provider/issues/222,我能够通过执行以下操作来解决它:

    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 监听用户数据并将其传递给下一个 Stream。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2021-06-15
      • 2020-04-21
      • 2019-06-14
      • 2017-10-25
      相关资源
      最近更新 更多