Зачем автору добавлять ключевое слово запомнить в этот @Composable?

#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, в котором объясняются основные принципы.