android 将可组合对象的范围扩展到父可组合对象

xxe27gdn  于 2023-06-20  发布在  Android
关注(0)|答案(2)|浏览(174)

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

    • 预期行为:**
  1. PreferencesScreen{
  2. PreferencesCheckBox(...){ ... }
  3. }

是可能的,

  1. PreferencesCheckBox(...){ ... }

单独是不可能的。

qeeaahzv

qeeaahzv1#

你可以像LazyColumn一样声明一些作用域:

  1. interface PreferencesScreenScope {
  2. @Composable
  3. fun PreferencesCheckBox()
  4. }
  5. private class PreferencesScreenScopeImpl: PreferencesScreenScope {
  6. @Composable
  7. override fun PreferencesCheckBox() {
  8. }
  9. }

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

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

使用PreferencesScreen如下:

  1. PreferencesScreen {
  2. PreferencesCheckBox()
  3. }
展开查看全部
jm81lzqq

jm81lzqq2#

我想向LazyListScope添加函数,但只能在Preferences下使用。我发现的最简单的方法是使用一个接口作为标志,并委托LazyListScope的实现。

  1. @Composable
  2. fun Preferences(
  3. modifier: Modifier = Modifier,
  4. dataStore: DataStore<Preferences> = LocalContext.current.settingsDataStore,
  5. content: PreferencesScope.() -> Unit
  6. ) {
  7. PreferencesProvider(dataStore = dataStore) {
  8. LazyColumn(modifier = modifier) {
  9. content(PreferencesScopeImpl(this))
  10. }
  11. }
  12. }
  13. interface PreferencesScope : LazyListScope
  14. class PreferencesScopeImpl(lazyListScope: LazyListScope): PreferencesScope, LazyListScope by lazyListScope

现在我可以使用PreferencesScope编写扩展函数了。

  1. fun PreferencesScope.preferenceItem(
  2. modifier: Modifier = Modifier,
  3. title: String,
  4. description: String? = null,
  5. onClick: () -> Unit = {}
  6. ) {
  7. item {
  8. PreferenceItem(
  9. modifier = modifier,
  10. title = title,
  11. description = description,
  12. onClick = onClick
  13. )
  14. }
  15. }
展开查看全部

相关问题