Текст, компонуемый с помощью 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)
))
}