Android Jetpack Compose + OKHttp

标签 android kotlin android-jetpack android-jetpack-compose

在尝试将 Jetpack Compose 与 OKHttp 结合使用时,我发出一个 HTTP 请求,如果成功返回,我想启动一个新 Activity ,否则向用户显示一条 toast 错误消息。

但是,我不确定如何实际startActivity。我收到以下错误:

fun performLogin(loginViewModel: LoginViewModel, context: Context) {
    try {
        val email = loginViewModel.email.value
        val password = loginViewModel.password.value

        val client = OkHttpClient()

        val serverUri = SystemService.getAPIUri()
        val loginUri = "$serverUri/login"

        val data = """
            "email": "$email",
            "password": "$password"
            """.trimIndent()

        val formBody = FormBody.Builder()
            .add("email", email.toString())
            .add("password", password.toString())
            .build()

        val body = data.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())

        val request = Request.Builder()
            .url(loginUri)
            .post(formBody)
            .build()

        val call = client.newCall(request)

        call.enqueue(object: Callback {
            override fun onFailure(call: Call, e: IOException) {
                e.printStackTrace()
            }

            override fun onResponse(call: Call, response: Response) {
                response.use {
                    if (!response.isSuccessful) throw IOException("Unexpected code $response")

                    for ((name, value) in response.headers) {
                        println("$name: $value")
                    }

                    println(response.body!!.string())

                    Looper.prepare()

                    // Gives an error here
                    loginCallback()

                    Looper.loop()

                }
            }

        })
    } catch (e: Exception) {
        println("Login Error: ")
        println(e)

        val toast = Toast.makeText(context, "Error Logging In", Toast.LENGTH_LONG)
        toast.show()
    }
}
@Composable
fun loginCallback() {
    val context = LocalContext.current

    context.startActivity(Intent(context, MainActivity::class.java))
}

如果出现 HTTP 错误,toast 将会崩溃,并提示我必须在主线程中运行它。

调用loginCallback()将不起作用,因为它说@Composable调用只能在@Composable函数的上下文中发生

最佳答案

由于 onResponse 不在可组合范围内,因此在 .enqueue(...) 之外声明 val coroutineScope = RememberCoroutineScope() 并在 coroutineScope.launch { } 内启动所需的代码,Toast.makeText(...) 也是如此。

关于Android Jetpack Compose + OKHttp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68433989/

相关文章:

java - 无法在 Java 中创建 Kotlin 对象 (Android)

android - 回收 View /交错网格布局管理器 : Force group of consecutive views into the same span/column

date - 如何在 Kotlin 中将日期字符串转换为时间戳?

Android 用 Emoji Fragment 替换键盘

android - ID在MainActivity.kt中显示为 Unresolved 引用

android - 使用 Jetpack EncryptedFile 安全性进行图像加密

android - 使用共享 ViewModel 的多个 fragment 中的单个实时事件

android-jetpack-compose - 如何正确从资源中获取Color(JetpackCompose)?

java - 使用 Twitter API 1.1 和 Retrofit 检索给定用户的推文列表

android - 如何在互联网可用时存储和发送队列文件