繁体   English   中英

当一个 stream 依赖于另一个时,如何在 flutter 中拥有多个应用程序流?

[英]How to have multiple app-wise streams in flutter, when one stream depends on the other?

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

我的主要障碍是其中一个流需要另一个流的数据,因此,我不能调用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(),
              //...
            }
        ),
      );
    }
  }
}

非常感谢!

基于这篇文章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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM