# #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
на ум приходит использование модификатора). Не стесняйтесь добавлять пример кода, который не работает с моей реализацией, и я, возможно, найду решение.