我正在尝试学习jetpack的编写,并尝试制作一个简单的应用程序,您可以在其中使用房间在概述列表中添加餐厅以及分数。
但是,每次我尝试在文本字段中键入单词时,该文本字段都不会更新,并且保持空白。我希望更新onValueChange函数中的locationName会触发状态更新,因为它是LiveData类的一部分。如何解决此问题而不必在modelView中创建单独的UI模型并将其转换为实体对象以防万一数据需要持久保存?
我的撰写功能
@Composable
fun AddItemScreenBody(modifier: Modifier = Modifier.Companion) {
VerticalScroller {
Column(modifier) {
var locations = addItemViewNodel.location.observeAsState()
FilledTextField(
value = locations.value!!.locationName,
onValueChange = { data -> locations.value!!.locationName = data },
label = { Text(stringResource(R.string.name), style = TextStyle(color = Color(0xFFC7C7C7))) })
}
}
}
我的视图模型
class AddItemViewModel () : ViewModel() {
var location : LiveData<LocationEntity> = MutableLiveData(LocationEntity())
}
我的数据模型
@Entity(tableName = "locations")
class LocationEntity @Ignore constructor () {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
@ColumnInfo(name = "location_name")
var locationName: String = ""
constructor (id: Long, locationName: String, category: Category) : this()
{
this.id = id
this.locationName = locationName
}
}
答案 0 :(得分:0)
使用最新的撰写版本 (1.0.0-alpha09),对于 TextField
部分,您可以执行以下操作:
@Composable
fun MyTextField() {
Column(Modifier.padding(16.dp)) {
val textFieldState = remember { mutableStateOf(TextFieldValue()) }
TextField(
value = textState.value,
onValueChange = { textFieldState.value = it },
onImeActionPerformed = { imeAction,controller ->
if (imeAction == ImeAction.Done){
locations.value.locationName = textFieldState.value.text
controller?.hideSoftwareKeyboard()
}
}
)
Text("text field value is: ${textFieldState.value.text}")
}
这里,不是在用户输入时保存数据,而是在用户执行操作时保存数据。
答案 1 :(得分:0)
不要使用 Modifier.Companion,只使用 Modifier。
不要使用垂直滚动条,使用lazycolumn
在你的视图模型中试试这个
var _location = MutableLiveData(LocationEntity())
var location: LiveData<LocationEntity>
get() = _location
fun onLocationChange(data){
_locations.value!!. locationName = data //Confirm that u r doing it right.
}
您确定您的房间实施正确吗?没有 DAO,没有存储库?
无论如何试试这个,让我知道
答案 2 :(得分:0)
Habib Kazemi 在评论中的回答是正确的并且解决了问题:
<块引用>locations.value!!.locationName = 数据更新值无济于事 相反,您应该调用 addItemViewNodel.location.setValue(new 具有所需位置名称的 LocationEntity 实例)