Kotlin 中具有多个参数的完成块

Completion block with multiple params in Kotlin

在我的应用程序中,我使用 Retrofit 进行网络调用,并将完成块传递给包装函数:

fun issueToken(phoneNumber: String, otp: String,completion:(token: Token?, errorString: String) -> Unit) { //TODO: return something??
    retrofitInstance.issueToken(LOGIN_GRANT_TYPE, LOGIN_CLIENT_ID,LOGIN_CLIENT_SECRET,phoneNumber, otp).enqueue(object : retrofit2.Callback<IssueTokenResponse> {
        override fun onFailure(call: retrofit2.Call<IssueTokenResponse>, t: Throwable) {
            completion(null, "NetworkManger: issueToken failed")
        }

        override fun onResponse(call: retrofit2.Call<IssueTokenResponse>, response: retrofit2.Response<IssueTokenResponse>) {
            if (response.code() == 200) {

                AccountManager.token.mAccessToken = response.body()?.access_token
                AccountManager.token.mRefreshToken = response.body()?.refresh_token
                AccountManager.token.mExpirationDate =
                    response.body()?.expires_in?.plus((System.currentTimeMillis() / 1000L));
                completion(AccountManager.token, "")

            } else {
                //TODO
                completion(null, "NetworkManager: issueToken response code = " + response.code() + " message = " + response.message() )
            }
        }
    })
}

现在,我不确定如何使用完成块调用 issueToken 方法,因为我是 Kotlin 的新手。我试过类似的东西:

NetworkManager.issueToken(view.phoneNumber.text.toString(),view.otp_edit_text_id.text.toString())  token, errorString -> { ... }

但我收到错误消息:

No value passed for parameter 'completion'

这部分我也有错误:

token, errorString ->

使用完成块调用函数的正确方法是什么?

我建议你先阅读kotlin lambda conventions

你应该这样称呼:

issueToken(view.phoneNumber.text.toString(),view.otp_edit_text_id.text.toString()) { token: Token?, errorString: String ->

}

你也可以这样使用:

 val completion = { token: Token?, errorString: String ->
    // define whatever you need
 }

 issueToken(view.phoneNumber.text.toString(),view.otp_edit_text_id.text.toString(), completion)