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)
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。
希望它能起作用。
| 归档时间: |
|
| 查看次数: |
2960 次 |
| 最近记录: |