I have the below code
class MainViewModel(private val todoDao: TodoDao) : ViewModel() {
private var todoList = mutableStateListOf<TodoItem>()
private val _todoListFlow = MutableStateFlow(todoList)
val todoListFlow: StateFlow<List<TodoItem>> get() = _todoListFlow
private var postExecute: (() -> Unit)? = null
init {
loadTodoList()
}
private fun loadTodoList() {
viewModelScope.launch {
todoDao.getAll().collect {
todoList = it.toMutableStateList()
_todoListFlow.value = todoList
postExecute?.invoke()
}
}
}
}
You notice the var todoList
is var
.
Since it get initialize only once, I hope to make it val
. How is that possible, given it is initialized in the viewModelScope?
CodePudding user response:
It is unclear why you are using a mixture of MutableStateFlow
and SnapshotStateList
to end up with MutableStateFlow<SnapshotStateList<TodoItem>>
when there is really no need for the _todoListFlow
, but to answer your question simply initialise the SnapshotStateList
then upon collection modify the data structure contents :
class MainViewModel(private val todoDao: TodoDao) : ViewModel() {
private val todoList = mutableStateListOf<TodoItem>()
private val _todoListFlow = MutableStateFlow(todoList)
val todoListFlow: StateFlow<List<TodoItem>> get() = _todoListFlow
private var postExecute: (() -> Unit)? = null
init {
loadTodoList()
}
private fun loadTodoList() {
viewModelScope.launch {
todoDao.getAll().collect {
todoList.clear() // optional if getAll has multiple emissions?
todoList.addAll(it)
_todoListFlow.value = todoList
postExecute?.invoke()
}
}
}
}