OutlineTextField 文本未更改

问题描述 投票:0回答:1

我是android开发的初学者,我对OutlineTextField有一些问题,情况是我想编辑OutlineTextField中已经存在的数据,但从数据库获取的文本无法删除,任何人都可以帮我找到这个问题的解决办法?

这是我的代码:

//书籍详情

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BookDetails(id: Int, booksViewModel: BooksViewModel) {

    var nameState = remember {mutableStateOf((""))}



    LaunchedEffect(Unit) {
        booksViewModel.getBook(id)
    }
    booksViewModel.getBook(id)
    val book = booksViewModel.getBook.observeAsState().value
    book?.let {
        nameState.value = it.name
    }

    book ?: return
        Column(
            modifier = Modifier
                .fillMaxSize()
                .padding(20.dp)
                .verticalScroll(rememberScrollState())
        ) {
            AsyncImage(
                model = "https://picsum.photos/id/24/500",
                contentDescription = null,
                modifier = Modifier
                    .fillMaxWidth()
                    .height(400.dp),
                contentScale = ContentScale.FillBounds
            )
            Spacer(modifier = Modifier.height(20.dp))
            OutlinedTextField(
                value = nameState.value,
                onValueChange = { nameState.value = it },
                label = { Text(stringResource(id = R.string.book_name)) },
                placeholder = {book.name}
            )
        }
}
android-jetpack-compose textfield styled-components android-jetpack jetpack
1个回答
0
投票

我认为当您更改

OutlinedTextField
中的文本并因此触发重组时,您会立即使用此处数据库中的值覆盖新值:

book?.let {
    nameState.value = it.name  // overwrite
}

问题是如果更改文本,您是否想要直接覆盖数据库中的值,或者只想将其存储在本地

nameState
中。我假设您想将新文本保存在本地
nameState
中,然后再保存到数据库中。

为了使其工作,您可以尝试以下代码:

var nameState: String? by remember { mutableStateOf(null) }

然后,在你的

OutlinedTextField
中,做

OutlinedTextField(
    value = nameState ?: book.name,  // display database text if no modified text available
    onValueChange = { nameState = it },
    label = { Text(stringResource(id = R.string.book_name)) },
    placeholder = { 
        Text(text = book.name))
    }
)

请注意,

placeholder
属性需要
Composable
,而不是
String

© www.soinside.com 2019 - 2024. All rights reserved.