将可组合项的范围限定为父可组合项

Lak*_*han 7 android kotlin android-jetpack-compose

我正在实现PreferencesScreenin Compose,并且已经制作了所有组件,例如PreferencesSwitchCheckBox等。
现在我想知道是否有任何方法可以使所有组件只能在函数范围内使用,PreferencesScreen而不能在其之外使用。
例如, in LazyColumnitems只能在内部使用LazyColumnScope。我查看了它的实现,但它使用了注释,@LazyScopeMarker所以我假设不同的范围有不同的标记?

预期行为:

PreferencesScreen{
    PreferencesCheckBox(...){ ... }
}
Run Code Online (Sandbox Code Playgroud)

是可能的,但是,

PreferencesCheckBox(...){ ... }
Run Code Online (Sandbox Code Playgroud)

独自一人是不可能的。

Phi*_*hov 11

您可以像LazyColumn下面一样声明一些范围:

interface PreferencesScreenScope {
    @Composable
    fun PreferencesCheckBox()
}

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

    }
}
Run Code Online (Sandbox Code Playgroud)

interface/class ...Impl在这里用来确保没有其他屏幕可以重复使用PreferencesScreenScopeImpl,也增加了测试的可能性。

使用它PreferencesScreen

@Composable
fun PreferencesScreen(content: @Composable PreferencesScreenScope.() -> Unit ) {
    PreferencesScreenScopeImpl().content()
}
Run Code Online (Sandbox Code Playgroud)

PreferencesScreen像这样使用:

PreferencesScreen {
    PreferencesCheckBox()
}
Run Code Online (Sandbox Code Playgroud)