异步回调无法返回报价列表报错,如何正确获取Offer列表?
问题:异步获取报价列表时返回值报错
我尝试从外部服务获取报价列表,相关代码如下:
触发购买方法
public void TriggerPurchase() { List<string> offers = listener.GetOffers(); Debug.Log("OFFERS " + offers[0]); }
获取报价方法
public List<string> GetOffers() { var purchases = GetComponent<Purchases>(); purchases.GetOfferings((offerings, error) => { if (offerings.Current != null && offerings.Current.AvailablePackages.Count != 0) { List<string> offers = new List<string>(); foreach (var package in offerings.Current.AvailablePackages) { //Debug.Log("Package " + package); if (package == null) continue; offers.Add(package.StoreProduct.PriceString); } return offers; // 错误:匿名函数转换为返回void的委托时不能返回值 } }); }
运行时出现错误提示:Anonymouse function converted to a void returning delegate cannot return a value,希望能正确获取报价列表。
更新:补充GetOfferings的实现代码:
/// <summary> /// GetOfferings的回调委托 /// </summary> /// <param name="offerings">请求成功时返回Offerings对象,否则为null</param> /// <param name="error">请求失败时返回错误信息,否则为null</param> public delegate void GetOfferingsFunc(Offerings offerings, Error error); private GetOfferingsFunc GetOfferingsCallback { get; set; } /// <param name="callback">获取到报价时触发的完成回调,若报价已缓存会立即调用。请求失败时Offerings为null</param> public void GetOfferings(GetOfferingsFunc callback) { GetOfferingsCallback = callback; _wrapper.GetOfferings(); }
解决方法
错误原因
- 委托返回值不匹配:
GetOfferingsFunc是返回void的委托,匿名回调里尝试return offers违反了委托定义,导致报错。 - 异步操作误用同步返回:
GetOfferings是异步方法,调用后不会立即拿到结果,GetOffers直接返回List<string>的写法根本拿不到异步请求的结果,还会引发空引用异常。
修正方案:改用回调传递异步结果
把GetOffers改成接收回调参数的形式,等异步请求完成后通过回调返回报价列表:
1. 修改GetOffers方法
// 定义回调委托,用于传递获取到的报价列表 public delegate void OffersReceivedCallback(List<string> offers, Error error); public void GetOffers(OffersReceivedCallback callback) { var purchases = GetComponent<Purchases>(); purchases.GetOfferings((offerings, error) => { // 先处理错误情况 if (error != null) { callback?.Invoke(null, error); return; } // 处理报价数据 List<string> offers = new List<string>(); if (offerings?.Current != null && offerings.Current.AvailablePackages.Count > 0) { foreach (var package in offerings.Current.AvailablePackages) { if (package?.StoreProduct != null) { offers.Add(package.StoreProduct.PriceString); } } } // 通过回调返回结果 callback?.Invoke(offers, null); }); }
2. 修改TriggerPurchase方法,适配异步回调
public void TriggerPurchase() { listener.GetOffers((offers, error) => { if (error != null) { Debug.LogError("获取报价失败:" + error.Message); return; } if (offers != null && offers.Count > 0) { Debug.Log("OFFERS " + offers[0]); // 这里可以继续处理报价,比如显示UI等 } else { Debug.LogWarning("没有可用报价"); } }); }
关键说明
- 异步操作不能用同步返回值的方式获取结果,必须通过回调、Task/Async-Await等异步模式处理。
- 增加了多层空值判断,避免
NullReferenceException。 - 明确错误处理逻辑,把错误信息通过回调传递,方便上层处理。
内容的提问来源于stack exchange,提问作者Ando
相关产品推荐
相关产品推荐

