如何使用 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】:

您可以将LaunchedEffectDisposableEffect 与常量键一起使用,例如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 如何调整最小宽度

什么是Jetpack Compose?带你走进Jetpack Compose~

Jetpack All In Compose ?看各种Jetpack库在Compose中的使用