如何使用 Jetpack Compose UI 在 Android 上正确跟踪屏幕视图?
Posted
技术标签:
【中文标题】如何使用 Jetpack Compose UI 在 Android 上正确跟踪屏幕视图?【英文标题】:How to properly track screen view on Android with Jetpack Compose UI? 【发布时间】:2021-11-26 12:16:32 【问题描述】:我想在只支持撰写的应用程序中跟踪屏幕视图,因此没有活动、片段,只有可组合的功能。
我应该何时以及如何调用屏幕跟踪,例如火力基地?
因为每次重组都会执行可组合函数的主体,所以副作用也可以重复调用,而这些都不是真正的“视图”,可组合函数可以是不可见的或只是测量的。
【问题讨论】:
【参考方案1】:您可以将LaunchedEffect
或DisposableEffect
与常量键一起使用,例如Unit
,以在可组合项进入组合时(在DisposableEffect
的情况下也在退出时)执行副作用,忽略重新组合.
// I don't think PascalCase would suit this method, as it suggests an on-screen element
@SuppressLint("ComposableNaming")
@Composable
fun trackScreenView(name: String)
DisposableEffect(Unit)
Log.d("SCREENTRACKING", "screen enter : $name")
onDispose Log.d("SCREENTRACKING", "screen exit : $name")
@Composable
fun Screen1()
trackScreenView("Screen 1")
// your screen content here
@Composable
fun Screen2()
trackScreenView("Screen 2")
// your screen content here
【讨论】:
感谢您的回答!对于简单的情况,任何副作用都足够好,但在更复杂的情况下,如 Pager 布局、LazyColumn/LazyRow、ModalDrawer,atm 会产生误导。例如。抽屉内容在用户不可见的情况下“在后台”进入合成。所以我不能使用副作用来跟踪它的视图。 当然,对于某些情况,您需要添加更多逻辑。检测特定可组合项是否对用户实际可见的通用方法并不容易,并且很可能会对性能产生显着影响(想到使用onGloballyPositioned
修饰符)。随意添加一个不适用于我的实现的代码示例,我可能会想出一个解决方案。【参考方案2】:
@Adrian K DisposableEffect,即使您在 Lazy Column 中使用 Lazy Rows,您的答案也会很好地工作。
DisposableEffect(Unit)
Log.d("SCREENTRACKING", "screen enter : $name")
onDispose Log.d("SCREENTRACKING", "screen exit : $name")
只有屏幕上的项目最初调用了 DisposableEffect,并且在列表中向下滚动或横向滚动时调用了新项目。细粒度展示数据需要改进的一个问题是,回滚之前已经渲染过的相同项目不一定会再次调用 DisposableEffect。
(会留下评论但需要更多声誉)
【讨论】:
以上是关于如何使用 Jetpack Compose UI 在 Android 上正确跟踪屏幕视图?的主要内容,如果未能解决你的问题,请参考以下文章
Jetpack Compose ScrollableTabRow 如何调整最小宽度
Jetpack Compose Runtime 与 NodeTree 管理
Jetpack Compose ScrollableTabRow 如何调整最小宽度
Jetpack Compose ScrollableTabRow 如何调整最小宽度