我是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}
)
}
}
我认为当您更改
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
。