Кнопка со значком Jetpack Compose в декораторе TextField не перекомпоновывается

У меня возникла проблема со значком текстового поля, вложенным в декоратор. Он не обновляется при изменении isPasswordVisible. Однако часть обфускации обновляется при изменении isPasswordVisible. Я помещаю журналы прямо перед IconButton, и они не достигаются при изменении isPasswordVisible.

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun PasswordTextField(
    state: TextFieldState,
    isPasswordVisible: Boolean,
    onTogglePasswordVisibility: () -> Unit,
    hint: String,
    title: String?,
    modifier: Modifier = Modifier
) {
    var isFocused by remember {
        mutableStateOf(false)
    }
    Column(
        modifier = modifier
    ) {
        Row(
            modifier = Modifier
                .fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceBetween,
            verticalAlignment = Alignment.CenterVertically
        ) {
            if (title != null) {
                Text(
                    text = title,
                    style = MaterialTheme.typography.titleSmall,
                )
            }
        }
        Spacer(modifier = Modifier.height(4.dp))
        BasicSecureTextField(
            state = state,
            textObfuscationMode = if (isPasswordVisible) {
                TextObfuscationMode.Visible
            } else TextObfuscationMode.Hidden,
            textStyle = LocalTextStyle.current.copy(
                color = MaterialTheme.colorScheme.onBackground
            ),
            cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground),
            modifier = Modifier
                .clip(RoundedCornerShape(16.dp))
                .background(
                    MaterialTheme.colorScheme.surface
                )
                .border(
                    width = 1.dp,
                    color = Color.Transparent,
                    shape = RoundedCornerShape(16.dp)
                )
                .padding(12.dp)
                .onFocusChanged {
                    isFocused = it.isFocused
                },
            decorator = { innerBox ->
                Row(
                    modifier = Modifier
                        .fillMaxWidth(),
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    Icon(
                        imageVector = PasswordIcon,
                        contentDescription = null,
                        tint = MaterialTheme.colorScheme.onSurface
                    )

                    Spacer(modifier = Modifier.width(16.dp))

                    Box(
                        modifier = Modifier
                            .weight(1f)
                    ) {
                        if (state.text.isEmpty() && !isFocused) {
                            Text(
                                text = hint,
                                color = MaterialTheme.colorScheme.onSurface.copy(
                                    alpha = 0.4f
                                ),
                                modifier = Modifier.fillMaxWidth()
                            )
                        }
                        innerBox()
                    }

                    IconButton(
                        onClick = onTogglePasswordVisibility,
                        modifier = Modifier.height(24.dp)
                    ) {
                        Icon(
                            imageVector = if (isPasswordVisible) {
                                EyeOpenIcon
                            } else {
                                EyeCloseIcon
                            },
                            contentDescription = if (isPasswordVisible) {
                                stringResource(id = R.string.show_password)
                            } else {
                                stringResource(id = R.string.hide_password)
                            },
                            tint = MaterialTheme.colorScheme.onSurface
                        )
                    }
                }
            }
        )
    }
}
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, это ошибка в BasicSecureTextField. В текущей стабильной версии 1.6.8 могу воспроизвести проблему, в текущей бета-версии 1.7.0-beta04 она исправлена.

Обновление до нестабильных версий официально не поддерживается Google при использовании Compose Bom, поэтому вам необходимо либо использовать какой-либо сторонний Bom, например https://github.com/chrisbanes/compose-bom/?tab=readme -ov-file или вернитесь к явному указанию версии каждого артефакта Compose.

При обновлении имейте в виду, что BasicSecureTextField изменил свой пакет, поэтому вам необходимо скорректировать операторы импорта.

Спасибо, думаю, сейчас попробую обходной путь. Я попробовал сторонний Bom, но проблема все равно возникла. Просматривая список изменений, кажется, что последняя версия у них — 1.7.0-beta02.

dman224 03.07.2024 19:45

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