stringResource() вызывает перекомпоновку композиции

Я новичок в создании реактивного ранца. Я отлаживал рекомпозицию, но вдруг увидел необычную рекомпозицию в функции создания заголовка при запуске приложения. Я узнаю причину или виновника рекомпозиции, которую я использовал в функции составления заголовка для получения строкового текста с помощью stringResource(). Если я использую context.getString() или строковое значение жесткого кода вместо stringResource(), тогда я не получил никакой рекомпозиции.

Этот код при показе рекомпозиции

      @Composable
fun MainScreen() {
    Header()
}

@Composable
fun Header() {
   Text(
    text = stringResource(id = R.string.app_name)
   )
}

Но если я использую эти коды, больше никакой перекомпоновки. Но почему?

      @Composable
fun MainScreen() {
    Header()
}

@Composable
fun Header() {
   val context = LocalContext.current
   Text(
    text = context.getString(R.string.app_name)
   )
}

Итак, что я могу сделать, чтобы избавиться от рекомпозиции при использовании stringResource() в функциях компоновки

1 ответ

Прежде всего, такого поведения быть не должно, я рекомендую создать чистый проект и повторить попытку.

Но... чтобы избежать перекомпоновки внутри Composable,EffectAPI было бы полезно:

          val context = LocalContext.current
    var appName = ""
        
    LaunchedEffect(Unit) {
        appName = context.getString(R.string.app_name)
    }
    Text(
        text = appName
    )

Коды внутриLaunchedEffectблок выполняется только один раз, даже если происходит перекомпоновка. Документация побочных эффектов API

Другие вопросы по тегам