繁体   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