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约定。

你应该这样打电话:

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)