我有一个Flutter应用程序,它使用FutureProviderFamily
从Isar
数据库中获取项目列表。
final FutureProviderFamily<List<Card>, Card> searchCardProvider =
FutureProvider.family(
(FutureProviderRef<List<Card>> ref, Card card) async {
final CardUtil cardUtil = await ref.watch(cardUtilProvider.future);
return cardUtil.search(card);
},
);
页面中的用法如下:
@override
Widget build(BuildContext context) => ref
.watch(
searchCardProvider(
card.Card()
..name = _searchText
..cardType = _cardType,
),
)
.when(...);
页面本身有一个保存卡类型的SegmentedButton
和一个用作搜索的TextFormField
,这些项的值被传递给提供程序。
我这里的问题是build方法一遍又一遍地重复运行。我尝试过使用select
函数,但不知道如何将其用于列表。也许有更好的方法来处理这个问题。有什么建议吗?
P.S:另一个列出所有数据的FutureProvider
工作完美,但无法根据参数过滤数据。
final FutureProvider<List<Card>> readAllCardProvider =
FutureProvider<List<Card>>(
(FutureProviderRef<List<Card>> ref) async {
final CardUtil cardUtil = await ref.watch(cardUtilProvider.future);
return cardUtil.readAll();
},
);
我也尝试过将Map
而不是Card type作为参数发送到Family,但没有成功。
谢谢!
1条答案
按热度按时间wlzqhblo1#
List<Card>
不适合用作RiverPod的系列标识符。https://riverpod.dev/docs/concepts/modifiers/family#passing-multiple-parameters-to-a-family家族没有向提供程序传递多个值的内置支持。
另一方面,该值可以是任何值(只要它符合前面提到的限制)。
这包括:
List<Card>
对于==没有深度等式,因此没有两个计算会显示相同的族提供者。或者,您可以使用具有更可靠的族标识符策略的生成的提供器。