簡體   English   中英

帶有 LiveData 和 MutableList 的 ViewModel 未在 Jetpack Compose 中更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM