[英]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.