Flutter Flotter中的StreamProvider:不要总是更改UI,而是在

Flutter Flotter中的StreamProvider:不要总是更改UI,而是在,flutter,google-cloud-firestore,flutter-provider,Flutter,Google Cloud Firestore,Flutter Provider,我有一个StreamProvider,如下所示 Stream<List<Match>> streamMatches() => FirebaseFirestore.instance.collection('matches').snapshots() .map((list) => list.docs.map((doc) => Match.fromJson(doc.data(), doc.id)).toList()); StreamProvide

我有一个
StreamProvider
,如下所示

Stream<List<Match>> streamMatches() =>
  FirebaseFirestore.instance.collection('matches').snapshots()
    .map((list) => list.docs.map((doc) => Match.fromJson(doc.data(), doc.id)).toList());

StreamProvider<List<Match>>(create: (context) => streamMatches(), initialData: [])
这很好,因为对DB的任何更新都会刷新流。然而,我不想让显示列表视图的UI为新的更新而不断实时更改(因为我认为这可能是一个糟糕的UX)

我想使用拉式刷新(
RefreshIndicator
)并仅更新列表视图
onRefresh

当然,我也希望在用户没有可视化列表时(例如,他暂停了应用程序)在后台更新匹配列表


我如何告诉
StreamProvider
仅在某些情况下更新,或者我应该使用哪个
提供程序进行更新?

您可以在下面更改此代码:

context.watch()
为此:

context.read()
.read
返回
列表
对象,而
.watch
使小部件侦听列表
上的更改

编辑

当您想要更新
列表
对象时,可以调用
setState
,它将重建UI并读取流的最新值

您提到要使用
RefreshIndicator
刷新列表

您只需将setState添加到
onRefresh
方法中,如下所示:

刷新指示器(
onRefresh:(){
设置状态(){
//这将刷新列表
});
}
)

好的,但这意味着在应用程序的整个生命周期中,列表永远不会更改,我不希望更改。好的,我会更新我的答案。@alexlipa,请查看最新的答案。这应该足以满足您的用例。我使用的是
无状态小部件
,因为我使用的是
提供者
。我将把它添加到问题中,我将建议将小部件更新为
StatefulWidget
。您不必仅仅因为使用了
提供程序
就使用
无状态小部件
。以下是
提供商
的创建者Rémi Rousselet的回答,解释如下:
   ListView(
      shrinkWrap: true,
      children: _getMatchesWidget(context.watch<List<Match>>())