Search
Write a publication
Pull to refresh
6
0
Send message

У вас есть 3 экрана под скоупом AuthGraph. нужно чтобы при попадании в AuthGraph (не важно, в какой экран) у вас отработал метод fetch() при старте. Можете, пожалуйста, написать небольшой пример, как вы сделаете вызов? Важно, чтобы вызов был один раз за все время жизни AuthGraph.

Например, создаю AuthFeatureViewModel

Скрытый текст
class AuthFeatureViewModel : ViewModel() {

    init {
        // do something
    }
}

Помещаю ее в скоуп фичи

Скрытый текст
val authModule = module {
    scope<Screen.AuthGraph> {
        viewModelOf(::AuthFeatureViewModel)
    }
}

Инициализирую AuthFeatureViewModel

Скрытый текст
@Composable
private fun Content() {

    val navController = rememberNavController()

    NavHost(
        navController = navController,
        startDestination = Screen.AuthGraph
    ) {

        navigation<Screen.AuthGraph>(
            startDestination = Screen.AuthGraph.EmailInput
        ) {
            composable<Screen.AuthGraph.EmailInput> { navBackStackEntry ->
                val parentNavBackStackEntry = rememberParentBackStackEntry(navController, navBackStackEntry)

                ParentScopeProvider<Screen.AuthGraph>(parentNavBackStackEntry) {

                    koinViewModel<AuthFeatureViewModel>()

                    ComposeScreenScopeProvider<Screen.AuthGraph.EmailInput> {
                        /* omitted code */
                    }
                }
            }

            // omitted code
        }
    }
}

AuthFeatureViewModel создается в скоупе фичи. Но есть минус с дублированием кода, потому что этот код

Скрытый текст
ParentScopeProvider<Screen.AuthGraph>(parentNavBackStackEntry) {

    koinViewModel<AuthFeatureViewModel>()

    // omitted code
}

Должен находиться в декларации каждого экрана, на который может быть совершен самый первый переход в рамках AuthGraph

Подскажите, пожалуйста, думали ли в сторону того, чтобы создавать скоупы, не привязывая их к вьюмоделям? 

Да, изначально пробовал делать без них. Уперся в то, что без ViewModel не получалось понять, в какой момент закрыть скоуп фичи.

И второй вопрос касательно вашего подхода: как выполнять операции, которые должны совершаться единожды при создании родительского скоупа? 

Для такого я создаю ViewModel, в скоупе фичи и выполняю действие внутри нее

Мы у нас на проекте сделали немного вычурно – создаем composable с navHost`ом, где описываем дочерние экраны –порождает огромное кол-во контроллеров, но зато есть возможность описать родительский контекст в одном месте, а не в каждой функции

А вы уже обрабатывали кейс, когда нужно передавать параметры в объект, который живет в рамках скоупа фичи? Это отдельное приключение

Замечание справедливое, поэтому я доработал компонент и обновил статью. Спасибо!

Не, я успел их застать. Дома стоял один из таких телефонов, правда потом заменили на кнопочный, а потом на беспроводной

спасибо!

Насчет более сложный лейаутов пока что не знаю т.к. на данный момент нет идей как и о чем именно можно было бы рассказать

Information

Rating
Does not participate
Registered
Activity

Specialization

Mobile Application Developer, Application Developer
Lead