Live Data with custom data class in kotlin android giving nu



我使用自定义数据类在我的ViewModel像这样

class MainViewModel(val initialvalue:MainModel): ViewModel() {
var countLiveData: MutableLiveData<MainModel>
init {
countLiveData = MutableLiveData<MainModel>()
countLiveData.value = MainModel("hi","hm")
}
fun increment(){
countLiveData.value?.two = countLiveData.value?.two + " Br"
}
}

这是数据类

data class MainModel(var one:String?, var two:String?)

这是主要活动

class MainActivity : AppCompatActivity() {
lateinit var mainViewModel: MainViewModel
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 2. add viewModel
mainViewModel = ViewModelProvider(this, MainViewModelFactory(MainModel("One String","String Two"))).get(MainViewModel::class.java)
binding.lifecycleOwner = this
binding.datamodel = mainViewModel
// 1. add life cycle observer
lifecycle.addObserver(MainObserver())
}
}

但问题是,当我使用editext改变变量数据"一"one_answers"二"时,实时变化并没有反映出来?

感谢

当你修改MainModel时,实时数据不知道它,不发送通知。要发送通知,必须更改countLiveData.value.

试试这样

fun increment(){
val value = countLiveData.value!!
countLiveData.value = value.copy(two = value.two + " Br")
}

但问题是,当我使用editext改变变量数据'一'和'二'时,实时变化没有反映出来?

为了在绑定到edittext时获得更新的值,值本身需要是可观察类型(如LiveData)。

现在onetwo只是普通的Strings-改变它们的值不会通知Databinding它们需要被反弹到UI。

你的ViewModel不应该有一个嵌套的视图模型来保存数据-你的ViewModel应该公开DataBinding可以观察和更新的可观察数据:

class MainViewModel(val initialvalue:MainModel): ViewModel() {
//var countLiveData: MutableLiveData<MainModel>
var oneLiveData: MutableLiveData<String>()
var twoLiveData: MutableLiveData<String>()    
init {
//countLiveData = MutableLiveData<MainModel>()
//countLiveData.value = MainModel("hi","hm")
oneLiveData.value = "hi"
twoLiveData.value = "hm"
}
fun increment(){
//countLiveData.value?.two = countLiveData.value?.two + " Br"
twoLiveData.value = twoLiveData.value + " Br"
}
}

如果你想保留嵌套的"MainModel"由于某些原因,它的属性必须是可观察类型。

data class MainModel(var one:MutableLiveData<String>, var two:MutableLiveData<String>)

最新更新