![](/img/trans.png)
[英]Jetpack Compose: LazyColumn not updating with MutableList
[英]ViewModel with LiveData and MutableList not Updating in Jetpack Compose
我是 Android 總體開發的新手,尤其是 Jetpack Compose 及其更新可組合件的方法。 我有一個 iOS 背景,但有很多 SwiftUI。
無論如何,我有以下應用程序
可組合項看起來像這樣:
@Composable
fun Greeting() {
Column(
modifier = Modifier
.fillMaxHeight()2
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.SpaceEvenly
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly
) {
IncrementButton()
DecrementButton()
}
PressedText()
SizeText()
}
}
@Composable
fun PressedText() {
val myViewModel: MyViewModel = viewModel()
val myNumber by myViewModel.number.observeAsState()
Text(text = "Pressed: $myNumber")
}
@Composable
fun SizeText() {
val myViewModel: MyViewModel = viewModel()
val myList by myViewModel.list.observeAsState()
Text(text = "Size: ${myList?.size}")
}
@Composable
fun IncrementButton() {
val myViewModel: MyViewModel = viewModel()
Button(onClick = myViewModel::add) {
Text("Add")
}
}
@Composable
fun DecrementButton() {
val myViewModel: MyViewModel = viewModel()
Button(onClick = myViewModel::remove) {
Text("Remove")
}
}
我正在使用的視圖 model 如下所示:
class MyViewModel : ViewModel() {
private val _number = MutableLiveData<Int>()
val number: LiveData<Int> = _number
private val _list = MutableLiveData<MutableList<Int>>()
val list: LiveData<MutableList<Int>> = _list
init {
_number.value = 0
_list.value = mutableListOf()
}
fun add() {
_number.value = _number.value?.plus(1)
_number.value?.let {
_list.value?.add(it)
_list.value = _list.value
}
}
fun remove() {
_number.value = _number.value?.minus(1)
if (_list.value?.isNotEmpty() == true) {
_list.value?.removeAt(0)
_list.value = _list.value
}
}
}
當我按下“添加”按鈕時,“按下”后的數字會更新,但“大小”后的數字不會更新。
我真的不確定那些帶有_list.value = _list.value
的行,我從其他一些 SO 帖子中得到的,這些帖子說要更新列表的引用。
我錯過了什么? 任何提示高度贊賞。
請隨時留下有關代碼設計的任何評論。
謝謝!
這個_list.value = _list.value
是一個非常糟糕的主意。 根據底層實現,它可能有效也可能無效。 在這種情況下,它可能通過指針進行比較,這就是它不會觸發重組的原因。
安全的方法是使用非可變列表:
private val _list = MutableLiveData<List<Int>>()
並像這樣改變它:
_list.value = _list.value?.toMutableList()?.apply {
add(value)
}
通過這樣做,您每次都會創建一個新列表,這將毫無問題地觸發重組。
此外,根本不需要使用LiveData
:如果您沒有某些依賴項,這會讓您使用它,您可以將 go 用於 Compose 可變 state:它更干凈:
var number by mutableStateOf(0)
private set
private val _list = mutableStateListOf<Int>()
val list: List<Int> = _list
fun add() {
number++
_list.add(number)
}
fun remove() {
number--
_list.removeAt(0)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.