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>>())