簡體   English   中英

Flutter中如何組合多個提供者

[英]How to combine multiple providers in Flutter

我是 Flutter 開發的新手。

我正在構建應用程序,一旦用戶登錄,就會顯示帖子列表。 如果用戶仍未登錄,則會顯示一些隨機帖子。

我在互聯網上獲得了部分應用程序的各種帖子。 這就是我所做的

class TestApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        Provider<AuthBase>(
          create: (context) => Auth(),
        ),
        StreamProvider<User>.value(
          value: Auth().onAuthStateChanged,
        ),
        ProxyProvider<User, Database>(
            update: (BuildContext context, User user, Database db) {
              return user == null
                  ? FirestoreDatabase(uid: null)
                  : FirestoreDatabase(uid: user.uid);
            }),
        ChangeNotifierProxyProvider<Database, PostProvider>(
          create: (context) => PostProvider(),
          update: (ctx, database, previousProvider) {
            print("at ChangeNotifierProxyProvider $previousProvider");
            return previousProvider.update(database);
          },
        ),
      ],
      child: MaterialApp(
        title: 'Test Project',
        home: LandingPage(),
      ),
    );
  }

我的想法是;

如果用戶登錄StreamProvider<User>.value將給該用戶ProxyProvider<User, Database>它將與該用戶創建數據庫。

而該數據庫又將被ChangeNotifierProxyProvider<Database, PostProvider>用來創建實際獲取帖子的提供者。 它使用數據庫來獲取帖子。

我注意到即使用戶在開始時登錄,我也會得到用戶的 null 值,然后我立即得到實際用戶。

在登錄頁面中,我只有以下行,它會產生錯誤

final provider = Provider.of<PostProvider>(context);

我注意到錯誤的原因是這一行;

previousProvider.update(database);

第一次調用 Postprovider 構造函數和更新方法沒有任何問題。 (這里我們得到 null 用戶)當使用實際用戶“previousProvider”創建 FirestoreDatabase 時,是 null。 這就是錯誤的原因。

不知道為什么會發生這種情況或如何解決它。 有沒有更好的方法來做到這一點?

最初獲得 null 值,即使有登錄用戶也可能是原因。 如何預防?

我將嘗試稍微解釋一下您的代碼,以便我們在同一頁面上

Provider<AuthBase>(
  create: (context) => Auth(), //this subscribe an Auth Class to the provider
),
StreamProvider<User>.value(
  value: Auth().onAuthStateChanged, 
  /// This subscribe a stream from another Auth Class instance
  /// Unless Auth its a singleton class, this is not related to the previous Provider
  /// and changes to Provider<AuthBase> won't affect this Stream
),

我注意到即使用戶在開始時登錄,我也會得到用戶的 null 值,然后我立即得到實際用戶。

使用 Stream 時會發生這種情況,而第一個值被捕獲(有時會延遲一個滴答聲)它的 null,如果您知道第一個值,則可以使用 initialData 參數,而 ZF7B44CFAFD5C52223D7498196C8A 訂閱完成

最后

ChangeNotifierProxyProvider<Database, PostProvider>(
   create: (context) => PostProvider(),
   update: (ctx, database, previousProvider) {
     print("at ChangeNotifierProxyProvider $previousProvider");
     return previousProvider.update(database);
   },
),

update期望返回PostProvider類型的值,但是您返回的是previousProvider.update(database)返回的任何方法(我認為它只是更新了一些內部變量或其他東西,我相信它可能是一些 void 方法?)

像這樣更改更新

update: (ctx, database, previousProvider) {
   print("at ChangeNotifierProxyProvider $previousProvider");
   return previousProvider..update(database);
   /// It's the same as writing this
   /// previousProvider..update(database);
   /// return previousProvider;
},

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM