【问题标题】:Completion block with multiple params in KotlinKotlin 中具有多个参数的完成块
【发布时间】:2021-06-26 07:24:49
【问题描述】:

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


    【解决方案1】:

    我建议你先阅读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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      相关资源
      最近更新 更多