上篇提到了無法在TodoDisplay展示正確的任務,因為目前的程式都是寫死的,現在要讓資料流通,才真的能作為一個應用使用
說到Android力推的MVVM架構,他其實是一種將整個專案變得更加有條理的架構
他是將UI層(view)、數據層(model)、邏輯層(viewmodel)分開處理:
簡單說說他的好壞:
Pros
我自己是覺得在良好的規劃下,MVVM架構明顯比單純的宣告remember state更有擴展力也更好檢查,所以在多數情況下我推薦使用MVVM
但如果只是 demo 小專案,用 remember { mutableStateOf() }
也沒關係,但只要專案稍微大一點,MVVM 就是必要的
這就是上文所說的邏輯層,他負責處理數據,並向UI層傳遞數據讓它顯示
目前我們已經說過了UI層,也就是最基本的UI顯示部分,至於數據層,會在大概Day 21時使用與結合
由於viewmodel部分比較複雜,這邊先介紹最基本的宣告與使用
先在MainActivity旁邊建立一個新的檔案
data class TodoItem(var title: String, var content: String, var group: String, var done: Boolean = false)
class GlobalVM : ViewModel() {
private val _todoList = MutableStateFlow<List<TodoItem>>(emptyList())
val todoList: StateFlow<List<TodoItem>> = _todoList
fun addTodo(todoItem: TodoItem) {
_todoList.update { current ->
current + todoItem
}
}
}
大致講解viewmodel的宣告與操作
ViewModel()
繼承的classStateFlow
形式存在.update
方式,不可以直接覆寫
fun Example(globalVM: GlobalVM = viewModel()) {
val globalState by globalVM.todoList.collectAsState()
}
透過viewModel()
可以直接在元件建立的時候產生一個新的viewmodel
接著就可以使用collectAsState將viewmodel中的數據取出使用
如果同時有太多元件collectState,可能會影響效能