#android #android-intent #android-jetpack-compose
Вопрос:
При попытке вызвать пользовательский интерфейс аутентификации Firebase, используя приведенный ниже код, компилятор выдает java.lang.Исключение IllegalStateException: Средство запуска не было инициализировано. Не уверен, почему пусковая установка не инициализирована
@Composable
internal fun ProfileUI(profileViewModel: ProfileViewModel) {
val loginLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result != null) {
//do something
}
}
if (profileViewModel.isAnonymousUser) {
loginLauncher.launch(profileViewModel.buildLoginIntent())
} else {
}
}
override fun buildLoginIntent(): Intent {
val authUILayout = AuthMethodPickerLayout.Builder(R.layout.auth_ui)
.setGoogleButtonId(R.id.btn_gmail)
.setEmailButtonId(R.id.btn_email)
.build()
return AuthUI.getInstance().createSignInIntentBuilder()
.setIsSmartLockEnabled(!BuildConfig.DEBUG)
.setAvailableProviders(
listOf(
AuthUI.IdpConfig.EmailBuilder().build(),
AuthUI.IdpConfig.GoogleBuilder().build()
)
)
.enableAnonymousUsersAutoUpgrade()
.setLogo(R.mipmap.ic_launcher)
.setAuthMethodPickerLayout(authUILayout)
.build()
}
java.lang.IllegalStateException: Launcher has not been initialized
at androidx.activity.compose.ActivityResultLauncherHolder.launch(ActivityResultRegistry.kt:153)
at androidx.activity.compose.ManagedActivityResultLauncher.launch(ActivityResultRegistry.kt:142)
at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:47)
at com.madhu.locationbuddy.profile.ProfileUIKt.ProfileUI(ProfileUI.kt:37)
at com.madhu.locationbuddy.profile.ProfileUIKt.ProfileUI(ProfileUI.kt:15)
Есть какие-нибудь идеи о том, как решить эту проблему?
Ответ №1:
В соответствии с побочными эффектами в документации по составлению:
Составные материалы не должны иметь побочных эффектов.
Ключевой термин: Побочный эффект-это изменение состояния приложения, которое происходит за пределами составной функции.
Запуск другого действия, такого как вызов launch
, является абсолютно побочным эффектом и, следовательно, никогда не должен выполняться как часть самой композиции.
Вместо этого вы должны поместить свой вызов для запуска в один из API — интерфейсов эффектов, например SideEffect
(если вы хотите, чтобы он выполнялся для каждой композиции) или LaunchedEffect
(который выполняется только при изменении входных данных-это было бы уместно, если profileViewModel.isAnonymousUser
бы управлялся a mutableStateOf()
).
Поэтому ваш код может быть изменен на:
internal fun ProfileUI(profileViewModel: ProfileViewModel) {
val loginLauncher = rememberLauncherForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result != null) {
//do something
}
}
if (profileViewModel.isAnonymousUser) {
SideEffect {
loginLauncher.launch(profileViewModel.buildLoginIntent())
}
} else {
// Output your UI, etc.
}
}
Комментарии:
1. Большое вам спасибо за то, что указали на это. Это решило проблему!