将Livedata与Jetpack结合使用

时间:2020-05-05 17:36:13

标签: android kotlin android-jetpack android-jetpack-compose

我正在尝试学习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
        }

    }

3 个答案:

答案 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 实例)