Riverpod FutureProvider 在添加 .family 修饰符后将继续触发

Agu*_*ana 3 dart flutter riverpod

所以我未来有这样的提供者

final additionalCostsProvider = FutureProvider.autoDispose.family<List<ExtraCost>, List<String>>((ref, cartCodes) {
  final cartAPI = ref.watch(cartAPIProvider);
  return cartAPI.getAdditionalCosts(cartCodes: cartCodes);
});
Run Code Online (Sandbox Code Playgroud)

如您所见,我将购物车代码 ( List<String>) 作为参数传递给我的FutureProvider

然后我像这样使用它

@override
  Widget build(context, ref) {
    final List<String> cartCodes = carts.map((cart) => cart.code).toList();
    final additionalCostsProviderAsynValue = ref.watch(additionalCostsProvider(cartCodes));

    return Scaffold(
      body: additionalCostsProviderAsynValue.when(
        loading: () => CircularProgressIndicator(),
        error: (error, stackTrace) {
          return ErrorDisplay(
            onButtonClicked: () => ref.refresh(additionalCostsProvider(cartCodes)),
          );
        },
        data: (results) {

          return Container();

        },
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

然后它会一遍又一遍地向服务器发出我的应用程序请求。

我相信问题出在.family修改器上。因为如果像下面的代码那样更改FutureProvider而不使用.family,则不会出现问题。

final additionalCostsProvider = FutureProvider.autoDispose<List<ExtraCost>>((ref) {
  final cartAPI = ref.watch(cartAPIProvider);
  return cartAPI.getAdditionalCosts(cartCodes: ["BA3131"]); // <--- if I hardcode it in here, the problem will not occurred
});
Run Code Online (Sandbox Code Playgroud)

Ker*_*n97 7

https://riverpod.dev/docs/concepts/modifiers/family/#parameter-restrictions

这是 Riverpod 修饰符.family的官方文档。

For families to work correctly, it is critical for the parameter passed to a
provider to have a consistent hashCode and ==.
Run Code Online (Sandbox Code Playgroud)

由于它是常量,您必须为其声明一个类,您可以使用包Equatable创建一个如下所示的类。

class ExtraCostParameter extends Equatable {
  final List<String> cartCodesList;

  const ExtraCostParameter({required this.cartCodesList});

  @override
  List<Object?> get props => [cartCodesList];
}
Run Code Online (Sandbox Code Playgroud)

您未来的新提供商将如下所示。

final additionalCostsProvider = FutureProvider.autoDispose.family<List<ExtraCost>, ExtraCostParameter>((ref, param) {
  final cartAPI = ref.watch(cartAPIProvider);
  return cartAPI.getAdditionalCosts(cartCodes: param.cartCodesList);
});
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您的值List<String>不恒定,您可能需要使用.autoDispose

希望它能起作用。