swift - 使用 Swift 回调处理程序时无法通过平台 channel 返回值

标签 swift flutter authorize.net flutter-platform-channel

我正在使用 Flutter 和 Swift。我正在尝试使用 AuthrizeNet SDK 授权信用卡,不幸的是,它本身不支持 Flutter。为了解决这个问题,我在我的 iOS AppDelegate 中创建了一个平台 channel ,我成功地管理了从 Flutter 接收数据。我现在的问题是如何从授权函数的回调处理程序内部返回该数据(来自 AuthorizeNet SDK)?在尝试调用 Flutter 结果函数时,Swift 编译器抛出此错误:Escaping closure captures non-escaping parameter 'result' .这是我的代码:

handler!.getTokenWithRequest(request, successHandler: { (inResponse:AcceptSDKTokenResponse) -> () in
                let paymentResponseModel: PaymentResponseModel = PaymentResponseModel.init(
                    token: inResponse.getOpaqueData().getDataValue(),
                    resultCode: inResponse.getMessages().getResultCode(),
                    tokenResultDescription: inResponse.getOpaqueData().getDataDescriptor(),
                    messageCode: inResponse.getMessages().getMessages()[0].getCode(),
                    messageText: inResponse.getMessages().getMessages()[0].getText()
                )
                result(String(data: try! JSONEncoder().encode(paymentResponseModel), encoding: String.Encoding.utf8))
            }) { (inError:AcceptSDKErrorResponse) in
                let paymentResponseModel: PaymentModelErrorResponse = PaymentModelErrorResponse.init(
                    code: inError.getMessages().getResultCode(),
                    message: inError.getMessages().getMessages()[0].getCode(),
                    details: inError.getMessages().getMessages()[0].getText()
                )
                result(String(data: try! JSONEncoder().encode(paymentResponseModel), encoding: String.Encoding.utf8))
            }
我尝试了在 getTokenWithRequest 之外调用结果函数的不同方式功能,但我无法让它工作。我对 Swift 编程还很陌生,所以如果这个问题含糊不清或有一个简单的解决方案,我深表歉意。谢谢!

最佳答案

问题在于successHandler将来会被调用(作为回调),但是 result必须立即调用,并且必须立即从代码片段的方法中返回。那么,您如何获得成功/错误响应?当 token 响应可用时,您必须从 native 调用 Dart。然后,在 Dart 结束时,您将不得不等待直到做出响应调用,此时您可以更新应用程序状态和 UI。
它变成了一个像这样的双向方法 channel :

---token request--->
<---result----------

<---token response--
----result--------->
result 都没有s 包含很多信息,但可用于传达错误。例如,如果第一个结果返回 false,则出现问题并且 Dart 端不应期望 token 响应 - 它不会发生。

关于swift - 使用 Swift 回调处理程序时无法通过平台 channel 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63140493/

相关文章:

authorize.net - 授权客户配置文件创建失败错误

json - Swift 函数在循环时不一致地返回 API 调用

ios - 如何在swift中调用这个函数

list - 如何从 dart/flutter 的列表中删除特定对象?

flutter - flutter上 "Denim blue"颜色的颜色矩阵代码是什么?

java - Authorize.net Java 示例

ios - Swift - 保存 [String : Any] to NSUserDefauls 的数组

ios - 如何使用 Alamofire 检测 304 statusCode

firebase - flutter 查询

webhooks - Authorize.Net 重复计费事件