我一直在开发Flutter应用程序,其中的一个小部件需要从firestore数据库中读取对象列表。
为此,我为特定对象(称为Polizza)建立了一个模型。
我有一个名为DatabaseService的类,其中包含获取Streams的方法。
在这种情况下,这是我用来查询数据库并获取流的方法:
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());
}
在父窗口小部件中,我正在使用StreamProvider来使他的孩子访问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是我为过滤器构建的对象类型。
我试图像这样更新StreamProvider:
StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid, filter: filter.value))
但它似乎无法重建。
如果他的参数之一发生变化,我如何通知StreamProvider重建自身?
答案 0 :(得分:1)
为SteamProvider
和Key
提供一个您在过滤器更改时更改的值。
因此,例如,使用值为'polizze${filter.value}'