如何在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,则会将CCD_ 2,它将与该用户一起创建数据库。

ChangeNotifierProxyProvider<Database, PostProvider>将使用该数据库来创建实际获取帖子的提供者。它使用数据库来获取帖子。

我注意到,即使用户在一开始就登录了,我也会得到该用户的null值,然后立即得到实际用户。

在登录页中,我只有下面一行,它会生成一个错误

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

我注意到错误的原因是这一行;

previousProvider.update(database);

第一次调用Postprovider构造函数和更新方法时没有任何问题。(这里我们得到null用户(当FirestoreDatabase与实际用户"一起创建时;previousProvider";为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参数

最后

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;
},

最新更新