使用 Swift 回调处理程序时无法通过平台通道 return 值

Unable to return value via Platform Channel when using Swift Callback Handlers

我正在使用 Flutter 和 Swift。我正在尝试使用 AuthrizeNet SDK 授权信用卡,不幸的是,它本身不支持 Flutter。为了解决这个问题,我在我的 iOS AppDelegate 中创建了一个平台通道,我成功地管理了从 Flutter 接收数据。我现在的问题是如何 return 来自授权函数(来自 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 必须立即被调用并且你必须从你的方法中 return代码片段立即。那么,如何获得 success/error 响应?当令牌响应可用时,您必须从本机调用 Dart。然后,在 Dart 端,您必须等待,直到发出响应调用,此时您可以更新您的应用程序状态,并且 UI.

变成这样的双向方法通道:

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

<---token response--
----result--------->

两个 result 都不包含太多信息,但可用于传达错误。例如,如果第一个结果返回 false,则说明出了点问题,Dart 端不应该期待令牌响应 - 它不会发生。