Android Livedata与jetpack组合

Android Livedata与jetpack组合,android,kotlin,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Jetpack,Android Jetpack Compose,我正在尝试学习jetpack compose,并尝试制作一个简单的应用程序,在该应用程序中,您可以使用room在概览列表中添加餐厅和分数 但是,每次我尝试在textfield中键入一个单词时,textfield都不会更新并且保持为空。我希望更新onValueChange函数中的locationName会触发状态更新,因为它是LiveData类的一部分。如何解决这个问题,而不必在modelView中创建单独的UI模型,并将其转换为实体对象,以防数据需要持久化 我的写作功能 @组合的 趣味AddI

我正在尝试学习jetpack compose,并尝试制作一个简单的应用程序,在该应用程序中,您可以使用room在概览列表中添加餐厅和分数

但是,每次我尝试在textfield中键入一个单词时,textfield都不会更新并且保持为空。我希望更新onValueChange函数中的locationName会触发状态更新,因为它是LiveData类的一部分。如何解决这个问题,而不必在modelView中创建单独的UI模型,并将其转换为实体对象,以防数据需要持久化

我的写作功能


@组合的
趣味AddItemScreenBody(修饰符:修饰符=修饰符.Companion){
垂直卷轴{
列(修改器){
var locations=addItemViewNodel.location.observeAsState()
填充文本字段(
value=locations.value!!.locationName,
onValueChange={data->locations.value!!.locationName=data},
label={Text(stringResource(R.string.name),style=TextStyle(color=color(0xFFC7C7C7)))}
}
}
}
我的视图模型

var _location = MutableLiveData(LocationEntity())
var location: LiveData<LocationEntity>
get() = _location

fun onLocationChange(data){
_locations.value!!. locationName = data //Confirm that u r doing it right.
}
class AddItemViewModel():ViewModel(){
变量位置:LiveData=MutableLiveData(LocationEntity())
}
我的数据模型

@实体(tableName=“locations”)
类LocationEntity@Ignore构造函数(){
@PrimaryKey(自动生成=真)
变量id:Long=0
@ColumnInfo(name=“location\u name”)
var locationName:String=“”
构造函数(id:Long,locationName:String,category:category):this()
{
this.id=id
this.locationName=locationName
}
}

对于最新的撰写版本(1.0.0-alpha09),对于
文本字段
部分,您可以执行以下操作:

@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}")
}

在这里,当用户键入时,数据将在用户执行操作时保存,而不是在用户键入时保存数据。

不要使用修饰符。Companion,仅使用修饰符

不要使用垂直滚动条,使用懒散列

在您的viewmodel中尝试此功能

var _location = MutableLiveData(LocationEntity())
var location: LiveData<LocationEntity>
get() = _location

fun onLocationChange(data){
_locations.value!!. locationName = data //Confirm that u r doing it right.
}
var\u location=MutableLiveData(LocationEntity())
变量位置:LiveData
获取()=\u位置
乐趣在线位置更改(数据){
_locations.value!!.locationName=data//确认您的操作正确。
}
您确定您的房间实施是正确的吗?没有DAO,就没有存储库


无论如何,尝试一下,让我知道

哈比卜·卡泽米在评论中的回答是正确的,并解决了问题:

地点。价值!!。locationName=数据更新值没有帮助 相反,您应该调用addItemViewNodel.location.setValue(新 具有所需locationName的LocationEntity实例)


嘿你试过@Model吗?
locations.value!!。locationName=data
更新
值将无济于事,相反,您应该调用
addItemViewNodel.location.setValue(具有所需locationName的LocationEntity的新实例)