Я разрабатываю приложение для Android в социальных сетях, используя Kotlin, Jetpack Compose и Supabase для аутентификации. Когда я пытаюсь войти с Google из моего AuthScreen Composable, приложение сразу же сбоя. LogCat отображает следующую ошибку: < /p>
FATAL EXCEPTION: main
Process: com.brandonnathanang.retrofy, PID: 4019
java.lang.NoClassDefFoundError: Failed resolution of: Lio/ktor/client/plugins/HttpTimeout;
at io.ktor.client.engine.cio.CIOEngine.(CIOEngine.kt:25)
at io.ktor.client.engine.cio.CIO.create(CIOCommon.kt:35)
at io.ktor.client.engine.HttpClientEngineFactory$DefaultImpls.create$default(HttpClientEngineFactory.kt:82)
at com.brandonnathanang.retrofy.SupabaseClient.(SupabaseClient.kt:26)
at com.brandonnathanang.retrofy.AuthScreenKt$AuthScreen$1$1$1$1.invokeSuspend(AuthScreen.kt:59)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.run(AndroidUiDispatcher.android.kt:57)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.app.ActivityThread.main(ActivityThread.java:8919)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@624b85f, androidx.compose.runtime.BroadcastFrameClock@649a2ac, StandaloneCoroutine{Cancelling}@9f2db75, AndroidUiDispatcher@cc3470a]
Caused by: java.lang.ClassNotFoundException: Didn't find class "io.ktor.client.plugins.HttpTimeout" on path: DexPathList[[zip file "/data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/base.apk"],nativeLibraryDirectories=[/data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/lib/arm64, /data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/base.apk!/lib/arm64-v8a, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:637)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
... 18 more
Сбой, по -видимому, связан с клиентом KTOR, используемым Supabase Kotlin SDK, в частности, из -за пропущенного класса io.ktor.client.plugins.httptimeout . Это происходит во время инициализации моего объекта Supabaseclient , когда запускается поток регистрации Google.
package com.brandonnathanang.retrofy
import android.app.Activity
import android.content.Context
import android.util.Log
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import io.github.jan.supabase.auth.auth
import io.github.jan.supabase.exceptions.RestException
import io.github.jan.supabase.postgrest.from
import io.github.jan.supabase.auth.providers.Google
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.util.UUID
fun Context.findActivity(): Activity? {
var currentContext = this
while (currentContext is android.content.ContextWrapper) {
if (currentContext is Activity) {
return currentContext
}
currentContext = currentContext.baseContext
}
return null
}
@Composable
fun AuthScreen(navController: NavController) {
var error by remember { mutableStateOf(null) }
var isLoading by remember { mutableStateOf(false) }
val coroutineScope = rememberCoroutineScope()
val context = LocalContext.current
val activity = context.findActivity() ?: run {
error = "Activity context unavailable"
return@run
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Button(
onClick = {
if (!isLoading) {
coroutineScope.launch {
isLoading = true
error = null
try {
Log.d("RetrofyAuth", "Starting Google Sign-In with Supabase")
SupabaseClient.client.auth.signInWith(Google)
repeat(10) {
val userId = SupabaseClient.client.auth.currentUserOrNull()?.id
if (userId != null) {
Log.d("RetrofyAuth", "Signed in user ID: $userId")
val userInfo = SupabaseClient.client.auth.currentUserOrNull()
var username = userInfo?.email?.substringBefore("@")
?: "user_${UUID.randomUUID().toString().substring(0, 8)}"
var suffix = 1
while (SupabaseClient.client.from("users")
.select { filter { eq("username", username) } }
.decodeList().isNotEmpty()) {
username = "${userInfo?.email?.substringBefore("@") ?: "user"}_$suffix"
suffix++
}
SupabaseClient.client.from("users").insert(
mapOf(
"id" to userId,
"email" to (userInfo?.email ?: ""),
"username" to username,
"favorite_decades" to emptyList()
)
)
Log.d("RetrofyAuth", "Inserted user: $username")
navController.navigate("throwback") { popUpTo("auth") { inclusive = true } }
return@launch
}
delay(1000)
}
error = "Sign-In timeout: No user detected"
Log.e("RetrofyAuth", "No user ID after polling")
} catch (e: RestException) {
error = "API error: ${e.error}"
Log.e("RetrofyAuth", "Rest error", e)
} catch (e: Exception) {
error = "Sign-In failed: ${e.message}"
Log.e("RetrofyAuth", "Unexpected error", e)
} finally {
isLoading = false
}
}
}
},
modifier = Modifier.fillMaxWidth(),
enabled = !isLoading
) {
Text(if (isLoading) "Signing in..." else "Sign in with Google")
}
if (error != null) {
Spacer(modifier = Modifier.height(8.dp))
Text(text = error ?: "", color = MaterialTheme.colorScheme.error)
}
}
}
< /code>
[b] что я попробовал < /strong>: < /p>
[list]
[*] Включите зависимости Supabase и KTOR в мою Build.gradle.kts < /code>:
implementation("io.github.jan-tennert.supabase:auth-kt:3.1.4")
implementation("io.github.jan-tennert.supabase:postgrest-kt:3.1.4")
implementation("io.github.jan-tennert.supabase:realtime-kt:3.1.4")
implementation("io.github.jan-tennert.supabase:storage-kt:3.1.4")
implementation("io.ktor:ktor-client-core:2.3.7")
implementation("io.ktor:ktor-client-cio:2.3.7")
[*] подтвердил, что supabaseclient.kt использует Engine Cio , который соответствует CioEngine в трассировке стека. Я также пытался использовать двигатель по умолчанию, удалив httpengine = cio.create () , но проблема сохраняется. /> [/list]
наблюдения [/b]:
Трассировка стека указывает на CioEngine , в соответствии с CIO , указанный в Supabaseclient.kt , но httptimeUout , указанный в Supabaseclient.kt , но httptimeUt , указанный в Supabaseclient.kt , но httptimeUout все еще не остается. Httptimeout класс является частью клиентских плагинов KTOR, и я подозреваю, что он не может быть включен в мои текущие зависимости или что Supabase требует конкретной конфигурации KTOR.
Я разрабатываю приложение для Android в социальных сетях, используя Kotlin, Jetpack Compose и Supabase для аутентификации. Когда я пытаюсь войти с Google из моего AuthScreen Composable, приложение сразу же сбоя. LogCat отображает следующую ошибку: < /p> [code]FATAL EXCEPTION: main Process: com.brandonnathanang.retrofy, PID: 4019 java.lang.NoClassDefFoundError: Failed resolution of: Lio/ktor/client/plugins/HttpTimeout; at io.ktor.client.engine.cio.CIOEngine.(CIOEngine.kt:25) at io.ktor.client.engine.cio.CIO.create(CIOCommon.kt:35) at io.ktor.client.engine.HttpClientEngineFactory$DefaultImpls.create$default(HttpClientEngineFactory.kt:82) at com.brandonnathanang.retrofy.SupabaseClient.(SupabaseClient.kt:26) at com.brandonnathanang.retrofy.AuthScreenKt$AuthScreen$1$1$1$1.invokeSuspend(AuthScreen.kt:59) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) at androidx.compose.ui.platform.AndroidUiDispatcher.performTrampolineDispatch(AndroidUiDispatcher.android.kt:81) at androidx.compose.ui.platform.AndroidUiDispatcher.access$performTrampolineDispatch(AndroidUiDispatcher.android.kt:41) at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.run(AndroidUiDispatcher.android.kt:57) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:230) at android.os.Looper.loop(Looper.java:319) at android.app.ActivityThread.main(ActivityThread.java:8919) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103) Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@624b85f, androidx.compose.runtime.BroadcastFrameClock@649a2ac, StandaloneCoroutine{Cancelling}@9f2db75, AndroidUiDispatcher@cc3470a] Caused by: java.lang.ClassNotFoundException: Didn't find class "io.ktor.client.plugins.HttpTimeout" on path: DexPathList[[zip file "/data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/base.apk"],nativeLibraryDirectories=[/data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/lib/arm64, /data/app/~~gdmVMlSlTsWTv8VnE93_lg==/com.brandonnathanang.retrofy-yHgBsaIaQtgrFBDqr6aqvA==/base.apk!/lib/arm64-v8a, /system/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) at java.lang.ClassLoader.loadClass(ClassLoader.java:637) at java.lang.ClassLoader.loadClass(ClassLoader.java:573) ... 18 more [/code] Сбой, по -видимому, связан с клиентом KTOR, используемым Supabase Kotlin SDK, в частности, из -за пропущенного класса io.ktor.client.plugins.httptimeout . Это происходит во время инициализации моего объекта Supabaseclient , когда запускается поток регистрации Google.[code]package com.brandonnathanang.retrofy
fun Context.findActivity(): Activity? { var currentContext = this while (currentContext is android.content.ContextWrapper) { if (currentContext is Activity) { return currentContext } currentContext = currentContext.baseContext } return null }
@Composable fun AuthScreen(navController: NavController) { var error by remember { mutableStateOf(null) } var isLoading by remember { mutableStateOf(false) } val coroutineScope = rememberCoroutineScope() val context = LocalContext.current val activity = context.findActivity() ?: run { error = "Activity context unavailable" return@run }
Column( modifier = Modifier .fillMaxSize() .padding(16.dp), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Button( onClick = { if (!isLoading) { coroutineScope.launch { isLoading = true error = null try { Log.d("RetrofyAuth", "Starting Google Sign-In with Supabase") SupabaseClient.client.auth.signInWith(Google) repeat(10) { val userId = SupabaseClient.client.auth.currentUserOrNull()?.id if (userId != null) { Log.d("RetrofyAuth", "Signed in user ID: $userId") val userInfo = SupabaseClient.client.auth.currentUserOrNull() var username = userInfo?.email?.substringBefore("@") ?: "user_${UUID.randomUUID().toString().substring(0, 8)}" var suffix = 1 while (SupabaseClient.client.from("users") .select { filter { eq("username", username) } } .decodeList().isNotEmpty()) { username = "${userInfo?.email?.substringBefore("@") ?: "user"}_$suffix" suffix++ } SupabaseClient.client.from("users").insert( mapOf( "id" to userId, "email" to (userInfo?.email ?: ""), "username" to username, "favorite_decades" to emptyList() ) ) Log.d("RetrofyAuth", "Inserted user: $username") navController.navigate("throwback") { popUpTo("auth") { inclusive = true } } return@launch } delay(1000) } error = "Sign-In timeout: No user detected" Log.e("RetrofyAuth", "No user ID after polling") } catch (e: RestException) { error = "API error: ${e.error}" Log.e("RetrofyAuth", "Rest error", e) } catch (e: Exception) { error = "Sign-In failed: ${e.message}" Log.e("RetrofyAuth", "Unexpected error", e) } finally { isLoading = false } } } }, modifier = Modifier.fillMaxWidth(), enabled = !isLoading ) { Text(if (isLoading) "Signing in..." else "Sign in with Google") } if (error != null) { Spacer(modifier = Modifier.height(8.dp)) Text(text = error ?: "", color = MaterialTheme.colorScheme.error) } } } < /code> [b] что я попробовал < /strong>: < /p> [list] [*] Включите зависимости Supabase и KTOR в мою Build.gradle.kts < /code>: implementation("io.github.jan-tennert.supabase:auth-kt:3.1.4") implementation("io.github.jan-tennert.supabase:postgrest-kt:3.1.4") implementation("io.github.jan-tennert.supabase:realtime-kt:3.1.4") implementation("io.github.jan-tennert.supabase:storage-kt:3.1.4") implementation("io.ktor:ktor-client-core:2.3.7") implementation("io.ktor:ktor-client-cio:2.3.7") [/code]
[*] подтвердил, что supabaseclient.kt использует Engine Cio , который соответствует CioEngine в трассировке стека. Я также пытался использовать двигатель по умолчанию, удалив httpengine = cio.create () , но проблема сохраняется. /> [/list] наблюдения [/b]: [list] Трассировка стека указывает на CioEngine , в соответствии с CIO , указанный в Supabaseclient.kt , но httptimeUout , указанный в Supabaseclient.kt , но httptimeUt , указанный в Supabaseclient.kt , но httptimeUout все еще не остается. Httptimeout класс является частью клиентских плагинов KTOR, и я подозреваю, что он не может быть включен в мои текущие зависимости или что Supabase требует конкретной конфигурации KTOR. [/list] [b] Вопросы [/b]: