簡體   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