flutter 使用FutureProviderFamily时停止重建

atmip9wb  于 2023-03-09  发布在  Flutter
关注(0)|答案(1)|浏览(107)

我有一个Flutter应用程序,它使用FutureProviderFamilyIsar数据库中获取项目列表。

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,但没有成功。
谢谢!

wlzqhblo

wlzqhblo1#

List<Card>不适合用作RiverPod的系列标识符。https://riverpod.dev/docs/concepts/modifiers/family#passing-multiple-parameters-to-a-family
家族没有向提供程序传递多个值的内置支持。
另一方面,该值可以是任何值(只要它符合前面提到的限制)。
这包括:

  • 元组中的元组
  • 使用Freezed或build_value生成的对象
  • 对象使用equatable

List<Card>对于==没有深度等式,因此没有两个计算会显示相同的族提供者。
或者,您可以使用具有更可靠的族标识符策略的生成的提供器。

相关问题