#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()
}