【问题标题】:Is there a way to tell if my composable is 'exposed' in Jetpack Compose?有没有办法判断我的可组合项是否在 Jetpack Compose 中“暴露”?
【发布时间】:2022-11-18 16:47:46
【问题描述】:

假设我们在屏幕上有 n 个特定的可组合项。

data class MyItem()

@Composable
fun MyComposable(myItem:Item, onExpose:() -> Unit) {
   Box {
      //blabla.... If any part of the Composable is exposed, it should call onExpose.
   }  
}

@Composable
fun MyComposableList() {
   // or LazyColumn, Anyway.
   Column {
       MyComposable(Item()) { println("Item 1 Exposed!!") }
       MyComposable(Item()) { println("Item 2 Exposed!!") }
       MyComposable(Item()) { println("Item 3 Exposed!!") }
       .....
       MyComposable(Item()) { println("Item 4 Exposed!!") }
   }
}

这些项目取决于各种变量,例如终端的大小和其他可组合项的组合,

可能一次全部曝光,也可能只曝光前几名。

我知道 ScrollState 让您“大致”知道当前滚动条中有多少项是可见的。

但是我想知道 Composable 是否可以自己知道它正在暴露在屏幕上。

这是 Compose 支持的功能吗?或者这是我必须使用 ScrollState 的部分?

【问题讨论】:

    标签: android-jetpack-compose


    【解决方案1】:

    从理论上讲,您无法确切知道可组合项是否暴露(或者我认为您想说绘制),让我解释一下。

    首先,在组合中,组合树同一级别上的任何可组合项都可以根据需要随时以任何顺序重新组合、公开或绘制。例如,您可以添加 SideEffect 或 LaunchedEffect 可与 MyItem 中的任何打印语句以及 onExpose 方法组合,并在不同的设备或模拟器上尝试,您可能会在每次运行时看到不同顺序的打印语句。但是,您可以使用 LazyDSL 信息(例如 LazyColumn 的状态)来获取可见项信息。在我看来,这是在您的案例中访问绘制信息的最佳方式,我在我的项目中以这种方式使用它。

    另一方面,就像给定的示例一样,您可以在 MyItem 中使用 SideEffect 可组合项,它最终会在 MyItem 暴露时运行,可能在暴露之前,可能在暴露之后,或者在暴露的同时。但最后,MyItem 最终将绘制到屏幕上,而 SideEffect 可组合项最终将运行,因此您可以使用 onExposed 并使您的可组合项具有“暴露感知能力”。基本上,这就是我如何实现“看到的 Instagram 故事”之类的功能。

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多