Flutter集成华为IAP获取商品列表代码报错如何解决
修复方案
你遇到的两个报错都是高版本华为IAP Flutter SDK适配空安全、参数规范调整导致的,老版本公开示例没有同步更新,按以下方式修改即可:
两个报错的根因
- 新版SDK将
skuIds、priceType设为ProductInfoReq构造函数的必填命名参数,不再支持实例化后再赋值的写法 - 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
相关产品推荐
相关产品推荐

