Flutter Provider,当其参数更改时更新StreamProvider

时间:2020-10-24 17:36:10

标签: flutter flutter-provider

我一直在开发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重建自身?

1 个答案:

答案 0 :(得分:1)

SteamProviderKey提供一个您在过滤器更改时更改的值。 因此,例如,使用值为'polizze${filter.value}'

的键