如何在Kotlin中保留登录令牌?

肯·霍尔

我觉得这里一定缺少一些简单的东西。我试图返回登录令牌,以便可以在整个应用程序中使用它。在onResponse方法中,登录令牌可以很好地打印到控制台,但是当我尝试返回该令牌时,我不能。

lateinit var authToken: String

    fun getAuthToken(user: User): String {
        sendPostRequest(user.username, user.password)
        return authToken
    }


    fun sendPostRequest(userName: String, password: String): String {


        var rb = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("username", userName)
            .addFormDataPart("password", password)
            .build()

        val request = Request.Builder().url(URL_AUTH_ADDRESS).post(rb).build()
        Log.d("request", request.toString())
        val client = OkHttpClient()

        var responseAuth = ""
        client.newCall(request).enqueue(object : Callback {

            override fun onResponse(call: Call?, response: Response?){
                val body = response?.body()?.string()
                authToken = response?.body()?.string()!!
                Log.d("usersAuthToken", body)
            }

            override fun onFailure(call: Call?, e: IOException?) {
                authToken = "fail"
            }

        })
        Log.d("outside method", "resp: " + authToken)
        return authToken


    }

如上所示,这将崩溃,说明authToken从未初始化。但是,当我删除return语句时,该Log.d("usersAuthToken", body)语句会像应有的那样打印令牌。

最终目标是使authToken在登录后在整个应用程序中持续存在。我在Kotlin领域非常环保,因此,如果我缺少更好的方法,请告诉我!

塞巴森茨

您试图在sendPostRequest完成异步函数之前返回令牌您应该将getAuthTokensendPostRequest功能更改为以下内容:

import kotlinx.coroutines.*

lateinit var authToken: String

    fun getAuthToken(user: User): String {
        runBlocking {
            sendPostRequest(user.username, user.password)
        }
        return authToken
    }


    suspend fun sendPostRequest(userName: String, password: String): String {


        var rb = MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("username", userName)
            .addFormDataPart("password", password)
            .build()

        val request = Request.Builder().url(URL_AUTH_ADDRESS).post(rb).build()
        Log.d("request", request.toString())
        val client = OkHttpClient()

        var responseAuth = ""
        client.newCall(request).enqueue(object : Callback {

            override fun onResponse(call: Call?, response: Response?){
                val body = response?.body()?.string()
                authToken = response?.body()?.string()!!
                Log.d("usersAuthToken", body)
            }

            override fun onFailure(call: Call?, e: IOException?) {
                authToken = "fail"
            }

        })
        Log.d("outside method", "resp: " + authToken)
        return authToken


    }

suspend用于指定它是否为异步函数,runBlocking并用于使线程等待直到该函数完成运行。

您还应该在build.gradle文件中添加以下内容以添加coroutines依赖项:

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'
}

并确保您使用最新的Kotlin版本:

buildscript {
    ext.kotlin_version = '1.3.50'
}

确保存储库列表中包含jcenter()或mavenCentral():

repository {
    jcenter()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章