从 Kotlin (Android) 中的监听器 onSuccess() 返回一个值

Her*_*arz 2 android return-value listener kotlin

我尝试这些教程:https://github.com/docusign/mobile-android-sdk/blob/master/README.md,尤其是 function getUserSignatureInfouserSignaturesGetUserSignature在此函数中进行REST API 调用 ( )。

userSignatureId在下面的代码中,我尝试返回从 REST API 获得的值 ( )。我明白,这种方式是不可能的,因为onSuccess()稍后将在外部函数 getUserSignatureInfo() 返回时调用。

getUserSignatureInfo()我想从 a调用Fragments onActivityCreated()并在创建 RecyclerView.Adapter 时使用该值。

问题是,执行此类操作的(最佳实践)方法是什么:进行 REST API 调用,等待响应,并在进一步的代码中使用响应。

// my Fragment
...
...
val userSignatureId = getUserSignatureInfo()
recyclerView.adapter = createMyAdapter(userSignatureId)
...
...



// function where the REST API call is made
fun getUserSignatureInfo(context: Context) : String {
    val eSignApiDelegate = DocuSign.getInstance().getESignApiDelegate()
    val usersApi = eSignApiDelegate.createApiService(UsersApi::class.java)

    val authDelegate = DocuSign.getInstance().getAuthenticationDelegate()
    val user = authDelegate.getLoggedInUser(context)

    var userSignatureId = ""

    eSignApiDelegate.invoke(object : DSESignApiListener {

        override fun <T> onSuccess(response: T?) {
            if (response is UserSignaturesInformation) {
                val userSignature = (response as UserSignaturesInformation).getUserSignatures().get(0)
                Log.d(TAG, "Signature Id: " + userSignature.signatureId);

                // My problem: this assignment is useless 
                // because the outer function getUserSignatureInfo()
                // returns earlier as onSuccess()
                userSignatureId = userSignature.signatureId
            }
        }

        override fun onError(exception: DSRestException) {
            // TODO: Handle error
        }
    }) {
        usersApi!!.userSignaturesGetUserSignature(user.accountId, user.userId, "signature")
    }
    
    // This is my problem: userSignatureId is empty because 
    // onSuccess() fires later as this function returns  
    return userSignatureId
} 
Run Code Online (Sandbox Code Playgroud)

非常感谢!

小智 5

例如,您可以将回调传递给 getUserSignatureInfo()

fun getUserSignatureInfo(context: Context, callback: (String)->Unit) : String {
    val eSignApiDelegate = DocuSign.getInstance().getESignApiDelegate()
    val usersApi = eSignApiDelegate.createApiService(UsersApi::class.java)

    val authDelegate = DocuSign.getInstance().getAuthenticationDelegate()
    val user = authDelegate.getLoggedInUser(context)


    eSignApiDelegate.invoke(object : DSESignApiListener {

        override fun <T> onSuccess(response: T?) {
            if (response is UserSignaturesInformation) {
                val userSignature = (response as UserSignaturesInformation).getUserSignatures().get(0)
                Log.d(TAG, "Signature Id: " + userSignature.signatureId);

                // return the value in the callback
                callback(userSignature.signatureId)

            }
        }
Run Code Online (Sandbox Code Playgroud)

当您想使用另一个类的字符串值时,

getUserSignatureInfo(context) { id ->
  Log.d("test", id)
}
Run Code Online (Sandbox Code Playgroud)