Текст, компонуемый с помощью Annotated String, неожиданно принимает тот же цвет, что и Button(), помещенный в ту же строку

Я построил компонуемый, который в основном представляет собой Rowсодержащий адрес как и рядом с ним. Адрес содержит метку (например, «Кому выставить счет:»), и для его немного другого форматирования я использую buildAnnotatedStringфункция.

Это довольно просто, но я заметил проблему, когда во время первого запуска адрес принимает цвет, назначенный составному элементу. Я проверил это, изменив Buttonцвет, и каждый раз результат один и тот же при первом запуске. При последующих запусках составной объект ведет себя так, как ожидалось, т. е. отображается черным цветом, как указано в text-style. Кто-нибудь может объяснить, почему это происходит, или сообщить, следует ли регистрировать это как проблему команде Jetpack Compose?

Скриншот из эмулятора первого запуска (воспроизводится и на физических устройствах Redmi):

Снимок экрана , представляющий последующие запуски и ожидаемое поведение :

Моя составная функция:

      @Composable
fun CheckoutAddress(
    modifier: Modifier = Modifier,
    addressLabel: String,
    address: String?,
    onChangeClick: () -> Unit
) {
    val separator = ": "
    val addressText = buildAnnotatedString {
        appendMedium(addressLabel)
        appendMedium(separator)
        addStyle(
            SpanStyle(
                fontSize = MaterialTheme.typography.body1.fontSize
            ),
            start = 0,
            end = "$addressLabel$separator".length - 1
        )
        if(address.isNullOrBlank()) {
            appendColored(stringResource(id = R.string.label_not_set), color = MaterialTheme.colors.error)
        } else {
            append(address)
        }
    }
    Row(
        modifier = modifier,
        verticalAlignment = Alignment.CenterVertically
    ) {

        Text(
            modifier = Modifier
                .weight(1f)
                .padding(end = CONTENT_TO_BUTTON_PADDING.dp),
            text = addressText,
            style = MaterialTheme.typography.body2,
            maxLines = 4,
            overflow = TextOverflow.Ellipsis
        )

        ChangeButton(
            onClick = onChangeClick
        )
    }
}

Составной элемент ChangeButton (The R.colors.default_blueцвет, указанный в области действия этого компонуемого, используется аннотированной строкой Text, изменили его значение и проверили):

      @Composable
fun ChangeButton(
    modifier: Modifier = Modifier,
    onClick: () -> Unit
) {
    TextButton(
        modifier = modifier,
        onClick = onClick,
        colors = ButtonDefaults.textButtonColors(contentColor = colorResource(id = R.color.defaultBlue))
    ) {
        Text(
            text = stringResource(id = R.string.label_change_button).uppercase()
        )
    }
}

Вспомогательные методы Annotated String, использованные выше:

      fun AnnotatedString.Builder.appendMedium(text: String) {
    append(AnnotatedString(text, SpanStyle(fontWeight = FontWeight.Medium)))
}

fun AnnotatedString.Builder.appendColored(text: String, color: androidx.compose.ui.graphics.Color) {
    append(AnnotatedString(
        text,
        SpanStyle(color = color)
    ))
}

0 ответов