簡體   English   中英

Flutter Provider,當他的參數改變時更新StreamProvider

[英]Flutter Provider, update StreamProvider when his parameter changes

我一直在開發這個 Flutter 應用程序,其中一個小部件需要從 firestore 數據庫中讀取對象列表。

為此,我為特定的 Object(稱為 Polizza)准備了一個 model。

我有一個名為 DatabaseService 的 class,它包含獲取流的方法。

在這種情況下,這是我用來查詢數據庫並獲得 stream 的方法:

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 是我為過濾器構建的 Object 類型。

我試過像這樣更新 StreamProvider:

StreamProvider(create: (BuildContext context) => DatabaseService().streamPolizze(id: user.uid, filter: filter.value))

但它似乎沒有重建。

如果他的參數之一發生變化,我如何通知 StreamProvider 重建自身?

SteamProvider提供一個Key ,您可以在過濾器更改時更改該密鑰。 因此,例如使用值為'polizze${filter.value}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM