@HiltViewModel
class TodoViewModel @Inject constructor(
private val getTodoListUseCase: GetTodoListUseCase,
private val addNewTodoUseCase: AddNewTodoUseCase
) : ViewModel() {
var todoItems = mutableStateListOf<Todo>()
private set
init {
viewModelScope.launch() {
todoItems = getTodoListUseCase.invoke().toMutableStateList()
}
}
// 다른 코드들...
}
상황:
ViewModel
이 가지는 mutableStateList
를 MainActivity
에서 Composable로 넘겨줌.
Composable은 한번 읽은 State에 대해서 값이 변화했을 때 변화를 감지하여 recompose를 진행한다고 배웠음.
근데 init
블럭의 코드를 통해 todoItems
의 값이 변화되어도 화면은 업데이트 되지 않았음.
이유:
init
블럭의 코드는 todoItems
가 참조하고 있는 리스트의 값을 바꾼 것이 아니라 아예 새로운 리스트를 참조하게 만들어버렸기 때문에, composable 입장에서 관찰하고 있는 리스트는 변화가 없으니까 업데이트를 안하는게 당연함.
해결:
init {
viewModelScope.launch {
todoItems.addAll(getTodoListUseCase.invoke().toMutableStateList())
}
}
todoItems에 값을 add 해주니까 화면 업데이트가 너무 잘된다.
이런... 허무한 실수.....