Составные элементы области действия для родительского составного элемента

#android #kotlin #android-jetpack-compose

Вопрос:

Я создаю реализацию PreferencesScreen in Compose и создал все компоненты PreferencesSwitch CheckBox
, такие как , и т.д. Теперь мне интересно, есть ли способ сделать так , чтобы все компоненты могли использоваться только внутри области действия PreferencesScreen функции и не могли использоваться за ее пределами. Как, например
, in LazyColumn , items может использоваться только внутри LazyColumnScope . Я посмотрел на его реализацию, но в нем использовалась аннотация @LazyScopeMarker , поэтому я предполагаю, что существуют разные маркеры для разных областей?

Ожидаемое Поведение:

 PreferencesScreen{
    PreferencesCheckBox(...){ ... }
}
 

возможно, но,

 PreferencesCheckBox(...){ ... }
 

в одиночку это невозможно.

Ответ №1:

Вы можете объявить некоторую область действия так же, как LazyColumn это делает:

 interface PreferencesScreenScope {
    @Composable
    fun PreferencesCheckBox()
}

private class PreferencesScreenScopeImpl: PreferencesScreenScope {
    @Composable
    override fun PreferencesCheckBox() {

    }
}
 

interface / class ...Impl используется здесь , чтобы убедиться, что никакой другой экран не может использоваться повторно PreferencesScreenScopeImpl , а также добавляет возможность тестирования.

Используйте его в PreferencesScreen :

 @Composable
fun PreferencesScreen(content: @Composable PreferencesScreenScope.() -> Unit ) {
    PreferencesScreenScopeImpl().content()
}
 

Используйте PreferencesScreen вот так:

 PreferencesScreen {
    PreferencesCheckBox()
}