【问题标题】:Livedata in combination with jetpack composeLivedata 与 jetpack 组合
【发布时间】:2020-05-05 17:36:13
【问题描述】:

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

但是,每次我尝试在文本字段中键入一个单词时,文本字段都不会更新并且保持为空。我希望在 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
        }

    }

【问题讨论】:

  • 嘿.. 你试过@Model 吗?
  • locations.value!!.locationName = data 更新 value 无济于事,您应该致电 addItemViewNodel.location.setValue(new Instance of LocationEntity with desired locationName)

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


【解决方案1】:

使用最新的 compose 版本 (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}")
}

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

【讨论】:

    【解决方案2】:

    不要使用 Modifier.Companion,只使用 Modifier。

    不要使用垂直滚动条,使用惰性列

    在你的视图模型中试试这个

    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,没有存储库?

    无论如何试试这个,让我知道

    【讨论】:

      【解决方案3】:

      在 cmets 中 Habib Kazemi 的回答是正确的并解决了问题:

      locations.value!!.locationName = 更新值的数据无济于事 相反,您应该调用 addItemViewNodel.location.setValue(new 具有所需位置名称的 LocationEntity 实例)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-25
        • 2020-04-08
        • 1970-01-01
        相关资源
        最近更新 更多