Как правильно отслеживать просмотр экрана на Android с помощью Jetpack Compose UI?

# #android #firebase #google-analytics #android-jetpack-compose #firebase-analytics

Вопрос:

Я хочу отслеживать просмотры экрана в приложении только для создания, поэтому никаких действий, фрагментов, только составные функции.

Когда и как я должен вызывать отслеживание экрана, например, для firebase?

Поскольку тело составляемой функции выполняется при каждой перекомпозиции, побочные эффекты также могут вызываться повторно, и ни один из них не означает реального «представления», составляемое может быть невидимым или просто измеренным.

Ответ №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
}
 

Комментарии:

1. Спасибо вам за ответ! Любой побочный эффект достаточно хорош для простых случаев, но может вводить в заблуждение в более сложных случаях, таких как макеты пейджеров, LazyColumn/LazyRow, ModalDrawer. Например. содержимое ящика входит в композицию «в фоновом режиме», пока не видно пользователю. Поэтому я не могу использовать побочный эффект для отслеживания его вида.

2. Конечно, в некоторых случаях вам нужно добавить немного больше логики. Общий способ определения того, действительно ли конкретный составляемый объект виден пользователю, не так прост и, скорее всего, оказывает заметное влияние на производительность ( onGloballyPositioned на ум приходит использование модификатора). Не стесняйтесь добавлять пример кода, который не работает с моей реализацией, и я, возможно, найду решение.