Мне нужно наблюдать/собирать данные из Stateflow внутри ViewModel, когда вызывается метод добавления. Но когда я добавляю элемент, состояние не выполняет перекомпоновку.
Это мой код ViewModel:
private var _selectedData = MutableStateFlow<MutableList<String>>(mutableListOf())
val data = listOf("Hello", "my", "name", "is", "Claire", "and", "I", "love", "programming")
val selectedData = _selectedData.asStateFlow()
fun addSelectedData(index: Int){
_selectedData.value.add(data[index])
Log.d("TAG", _selectedData.value.toString())
}
И это мой компонуемый код:
val mainViewModel: MainViewModel = viewModel()
val selectedData by mainViewModel.selectedData.collectAsState()
LaunchedEffect(key1 = selectedData){
Log.d("TAG", "SELECTED $selectedData")
}
Заранее спасибо.
MutableStateFlow
не может заметить, что вы изменили объект, который он держит. Вы должны установить новый объект на MutableStateFlow
, поэтому новый список.
Измените тип _selectedData
на MutableStateFlow<List<String>>
, а затем выполните:
_selectedData.value = _selectedData.value + data[index]
Вы можете сделать его короче с помощью:
_selectedData.value += data[index]
Это не о List
против MutableList
. list.add(item)
добавляется в существующий список и MutableStateFlow
не может об этом знать. list + item
не затрагивает существующий список, а создает совершенно новый список, и когда мы назначаем его MutableStateFlow
, он видит разницу. К сожалению, я считаю, что Kotlin не предоставляет простой способ создать новый список, добавив/удалив/заменив элемент в середине. Вероятно, проще всего будет создать изменяемую копию списка, изменить ее и переназначить: val list = _selectedData.value.toMutableList(); list.add(2, "a"); _selectedData.value = list
.
Большое спасибо, мистер Брут. Это работает. Никогда не думал, что мы должны использовать List вместо MutableList. Извините, если это не по теме, но можем ли мы изменить данные в конкретном индексе?