#android #android-jetpack-compose
Вопрос:
Код A взят из лаборатории тематических моделей проекта, полный код вы можете увидеть здесь.
Я думаю, что ключевое remember
слово не обязательно в коде A.
Я протестировал код B, похоже, я могу получить тот же результат, что и код A.
Зачем автору добавлять remember
в это ключевое @Composable
слово ?
Код А
@Composable
fun Home() {
val featured = remember { PostRepo.getFeaturedPost() }
val posts = remember { PostRepo.getPosts() }
MaterialTheme {
Scaffold(
topBar = { AppBar() }
) { innerPadding ->
LazyColumn(contentPadding = innerPadding) {
item {
Header(stringResource(R.string.top))
}
item {
FeaturedPost(
post = featured,
modifier = Modifier.padding(16.dp)
)
}
item {
Header(stringResource(R.string.popular))
}
items(posts) { post ->
PostItem(post = post)
Divider(startIndent = 72.dp)
}
}
}
}
}
Код B
@Composable
fun Home() {
val featured =PostRepo.getFeaturedPost()
val posts = PostRepo.getPosts()
...//It's the same with the above code
}
Ответ №1:
Вам нужно использовать remember
, чтобы предотвратить повторное вычисление во время перекомпозиции.
Ваш пример работает без remember
, потому что это представление не будет изменяться при прокрутке.
Но если вы используете анимацию, добавляете переменные состояния или используете модель представления, ваше представление может быть перекомпозировано много раз(при анимации до одного кадра), и в этом случае получение данных из хранилища будет повторяться много раз, поэтому вам нужно использовать remember
для сохранения результата вычисления между перекомпозициями.
Поэтому всегда используйте remember
внутри конструктора представлений, если вычисления, по крайней мере, немного тяжеловаты, даже если сейчас кажется, что представление не будет перекомпозировано.
Вы можете прочитать больше о состоянии в compose в документации, включая это видео на YouTube, в котором объясняются основные принципы.