Flutter Riverpod:如何向Family传递3个参数?
Riverpod Family传递3个参数的实现方案
Riverpod的Family默认仅支持单个额外参数,要传递3个参数,有两种常用实现方式:
方式一:自定义参数类(推荐,可读性强)
首先定义一个封装3个参数的数据类,必须重写==和hashCode以保证Riverpod的状态缓存正常工作:
class VendorEmployeeParams { final String vendorCode; final String secondParam; final int thirdParam; // 根据实际需求替换类型 VendorEmployeeParams({ required this.vendorCode, required this.secondParam, required this.thirdParam, }); @override bool operator ==(Object other) => identical(this, other) || other is VendorEmployeeParams && runtimeType == other.runtimeType && vendorCode == other.vendorCode && secondParam == other.secondParam && thirdParam == other.thirdParam; @override int get hashCode => vendorCode.hashCode ^ secondParam.hashCode ^ thirdParam.hashCode; }
接着修改你的FutureProvider.family,将参数类型改为这个自定义类:
final allEmployeeOfVenodrsOfaParticularVenderUser = FutureProvider.family< List<AllEmployeeOfVendorParticularVenUser>, VendorEmployeeParams>( (ref, params) { return ref .read(apiProvider) .getAllEmployeeOfaparticluarVendorUser( vendorCode: params.vendorCode, secondParam: params.secondParam, thirdParam: params.thirdParam, ); }, );
使用时传入类实例:
ref.watch(allEmployeeOfVenodrsOfaParticularVenderUser( VendorEmployeeParams( vendorCode: 'VENDOR_001', secondParam: 'ACTIVE', thirdParam: 10, ), ));
方式二:使用Tuple3(快速实现)
借助tuple包的Tuple3来封装参数,无需自定义类:
- 添加依赖到
pubspec.yaml:
dependencies: tuple: ^2.0.2
- 修改Provider:
import 'package:tuple/tuple.dart'; final allEmployeeOfVenodrsOfaParticularVenderUser = FutureProvider.family< List<AllEmployeeOfVendorParticularVenUser>, Tuple3<String, String, int>>( (ref, tuple) { return ref .read(apiProvider) .getAllEmployeeOfaparticluarVendorUser( vendorCode: tuple.item1, secondParam: tuple.item2, thirdParam: tuple.item3, ); }, );
- 使用时传入
Tuple3实例:
ref.watch(allEmployeeOfVenodrsOfaParticularVenderUser( Tuple3('VENDOR_001', 'ACTIVE', 10), ));
关键注意点
作为Family参数的类型必须具备可比较性:自定义类必须重写==和hashCode,Tuple类已默认实现该逻辑,否则Riverpod无法正确区分不同参数对应的状态,导致缓存异常。
内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga
相关产品推荐
相关产品推荐

