Не работает локальная переменная Kotlin - PullRequest
0 голосов
/ 30 апреля 2018

В этом методе я использую топливный каркас для манипулирования HTTP-запросами. Проблема в том, что я не могу изменить локальную переменную успеха. Может кто-нибудь мне помочь? Я попытался определить поле и статическое поле, но безуспешно. (Метод работает правильно, однако логическое значение не возвращается правильно ..)

fun getToken(email: String, password: String): Boolean {
    //TODO("Fix Success Boolean! --> alawys false")
    var success = false
    var auth  ="/auth/token.json".httpPost()
            .body("""{"username":"$email", "password":"$password"}""", Charsets.UTF_8)
            .header(mapOf("Content-Type" to "application/json"))
            .response { request, response, result ->

                when (result) {
                    is Result.Failure -> {

                        // val data = result.get()
                        val ex = result.getException()

                        Log.println(Log.ASSERT, "RESULT", response.data.toString(Charsets.UTF_8))
                        Log.println(Log.ASSERT, "Request", request.cUrlString())
                        Log.println(Log.ASSERT, "Exception_Message", ex.message)
                        Log.println(Log.ASSERT, "Response_Message", ex.response.responseMessage)

                        success = false
                    }
                    is Result.Success -> {
                        val data = result.get()
                        val returnJson = data.toString(Charsets.UTF_8)
                        Log.println(Log.ASSERT, "RESULT_LOGIN", returnJson)
                        success = true

                        // Parse return Json
                        // e.g. {"id":"36e8fac0-487a-11e8-ad4e-c471feb11e42","token":"d6897a230fd7739e601649bf5fd89ea4b93317f6","expiry":"2018-04-27T17:49:48.721278Z"}
                        val jelement = JsonParser().parse(returnJson)
                        val jobject = jelement.getAsJsonObject()

                        // save field for class-scope access
                        token = jobject.get("token").asString
                        id = jobject.get("id").asString
                    }
                }
            }
    return success
}

1 Ответ

0 голосов
/ 30 апреля 2018
// ...
.response { request, response, result ->
    // params 'request, response, result' are available only there
    // so you can't synchronous return value from there
}

// and they're not available there 
// and all changes made in scope above won't be seen from there

Пожалуйста, прочитайте больше о асинхронных методах.

Попробуйте использовать что-то вроде:

fun getToken(email: String, password: String, callback: (Boolean) -> Unit) {
     // your code
     var success = false

     // ... manipulate with success
     callback(success)
}

А затем вызвать этот метод:

getToken("email", "password") { success ->
    if (success) 
         Log.i("tag", "Success!")
    else 
         Log.i("tag", ":(")  
}
...