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)
在我的应用程序中,我使用 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)