You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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来封装参数,无需自定义类:

  1. 添加依赖到pubspec.yaml:
dependencies:
  tuple: ^2.0.2
  1. 修改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,
        );
  },
);
  1. 使用时传入Tuple3实例:
ref.watch(allEmployeeOfVenodrsOfaParticularVenderUser(
  Tuple3('VENDOR_001', 'ACTIVE', 10),
));

关键注意点

作为Family参数的类型必须具备可比较性:自定义类必须重写==和hashCode,Tuple类已默认实现该逻辑,否则Riverpod无法正确区分不同参数对应的状态,导致缓存异常。

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:45:41