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

Flutter集成华为IAP获取商品列表代码报错如何解决

修复方案

你遇到的两个报错都是高版本华为IAP Flutter SDK适配空安全、参数规范调整导致的,老版本公开示例没有同步更新,按以下方式修改即可:

两个报错的根因

  1. 新版SDK将skuIds、priceType设为ProductInfoReq构造函数的必填命名参数,不再支持实例化后再赋值的写法
  2. Dart空安全校验要求返回值和声明类型完全匹配,可空类型不能直接赋值给非空类型,catch分支返回null也不符合非空返回声明

修复后代码

// 方案1:保持返回值非空,异常/无数据时返回空列表
Future<List<ProductInfo>> getConsumableProducts() async {
  try {
    // 构造时直接传入必填参数
    ProductInfoReq req = ProductInfoReq(
      priceType: IapClient.IN_APP_CONSUMABLE,
      skuIds: ["prod_01", "prod_02"],
    );
    ProductInfoResult res = await IapClient.obtainProductInfo(req);
    // 空值处理,为空则返回空列表
    return res.productInfoList ?? [];
  } on PlatformException catch (e) {
    log(e.toString());
    // 异常场景也返回非空的空列表,和方法声明匹配
    return [];
  }
}

// 方案2:如果业务需要区分「接口异常」和「无商品」场景,调整返回值为可空类型
Future<List<ProductInfo>?> getConsumableProducts() async {
  try {
    ProductInfoReq req = ProductInfoReq(
      priceType: IapClient.IN_APP_CONSUMABLE,
      skuIds: ["prod_01", "prod_02"],
    );
    ProductInfoResult res = await IapClient.obtainProductInfo(req);
    return res.productInfoList;
  } on PlatformException catch (e) {
    log(e.toString());
    return null;
  }
}

可选优化点

  • 如果业务场景不允许返回空列表,可以在空值/异常场景抛自定义业务异常,上层调用时统一捕获处理
  • 正式上线前建议添加skuId非空校验,避免传空参数触发SDK报错

内容的提问来源于stack exchange,提问作者Ihab07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:39:00