Flutter Provider,当他的参数改变时更新StreamProvider
Flutter Provider, update StreamProvider when his parameter changes
我一直在开发这个 Flutter 应用程序,其中一个小部件需要从 firestore 数据库中读取 Object 的列表。
为此,我有一个特定 Object 的模型(称为 Polizza)。
我有一个名为 DatabaseService 的 class,它包含获取流的方法。
在这种情况下,这是我用来查询数据库并获取流的方法:
Stream<List<Polizza>> streamPolizze({String id, String filter = ''}) {
var ref = _db
.collection('polizze')
.doc(id)
.collection('elenco')
.orderBy('indice');
if (filter.isNotEmpty) {
List<String> list = filter.split(' ').map((e) => e.toUpperCase());
ref = ref.where('indice', arrayContainsAny: list);
}
return ref.limit(10).snapshots().map(
(list) => list.docs.map((doc) => Polizza.fromFirestore(doc)).toList());
}
在 parent 小部件中,我使用 StreamProvider 使他的 children 能够访问 Polizza 列表:
@override
Widget build(BuildContext context) {
var user = Provider.of<User>(context);
var filter = Provider.of<FilterPolizze>(context);
return MultiProvider(
providers: [
StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid))
],
child: ...
);
}
成功了。
但现在我想对查询应用过滤器。
为此,我构建了一个简单的 TextField 小部件,它能够通过 ChangeNotifierProvider 为我提供过滤器值。
这工作正常,事实上我可以从 Provider.of(context) 读取过滤器和他的更新。
FilterPolizze 是我为过滤器构建的 Object 类型。
我试过像这样更新 StreamProvider:
StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid, filter: filter.value))
但是好像没有重建。
如果他的参数之一发生变化,我如何通知 StreamProvider 重建自身?
给 SteamProvider
一个 Key
,当过滤器改变时,你会改变它。
因此,例如使用值为 'polizze${filter.value}'
的键
我一直在开发这个 Flutter 应用程序,其中一个小部件需要从 firestore 数据库中读取 Object 的列表。
为此,我有一个特定 Object 的模型(称为 Polizza)。
我有一个名为 DatabaseService 的 class,它包含获取流的方法。
在这种情况下,这是我用来查询数据库并获取流的方法:
Stream<List<Polizza>> streamPolizze({String id, String filter = ''}) {
var ref = _db
.collection('polizze')
.doc(id)
.collection('elenco')
.orderBy('indice');
if (filter.isNotEmpty) {
List<String> list = filter.split(' ').map((e) => e.toUpperCase());
ref = ref.where('indice', arrayContainsAny: list);
}
return ref.limit(10).snapshots().map(
(list) => list.docs.map((doc) => Polizza.fromFirestore(doc)).toList());
}
在 parent 小部件中,我使用 StreamProvider 使他的 children 能够访问 Polizza 列表:
@override
Widget build(BuildContext context) {
var user = Provider.of<User>(context);
var filter = Provider.of<FilterPolizze>(context);
return MultiProvider(
providers: [
StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid))
],
child: ...
);
}
成功了。
但现在我想对查询应用过滤器。 为此,我构建了一个简单的 TextField 小部件,它能够通过 ChangeNotifierProvider 为我提供过滤器值。 这工作正常,事实上我可以从 Provider.of(context) 读取过滤器和他的更新。 FilterPolizze 是我为过滤器构建的 Object 类型。
我试过像这样更新 StreamProvider:
StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid, filter: filter.value))
但是好像没有重建。
如果他的参数之一发生变化,我如何通知 StreamProvider 重建自身?
给 SteamProvider
一个 Key
,当过滤器改变时,你会改变它。
因此,例如使用值为 'polizze${filter.value}'