Помните, что пусковая установка для запуска активных бросков не была инициализирована в Jetpack Compose

#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. Большое вам спасибо за то, что указали на это. Это решило проблему!