添加依賴
// ViewModel implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'
在 build.gradle(Module:Unscramble.app) 添加
ViewModel
class GameViewModel : ViewModel() {
}
在 Fragment 中建立
private val viewModel: GameViewModel by viewModels()
委託(delegate)
每個 var 變數都會自動產生 getter 、 setter 函數,在你為其賦值或取值時,系統會呼叫它們。
val 只會產生 getter 函數。
🚄使用 Kotlin 的委託,可以將 getter、setter 的責任交給另一個類別(委託類別 delegate class )。
// Syntax for property delegation
var : by ()
使用 by 子句和 delegate class 進行定義
delegate class 會在第一次造訪時建立實例並保留數據,在收到請求時回傳。
優點 : 不會因為設備配置變更(如旋轉設備)而遺失數據。
by activityViewModels()
如有需要,也可以不要使用 by viewModels(),而使用 by activityViewModels() , 使用 所在 activity 的 viewModel。
- viewModels() 提供範圍限定於目前片段(fragment)的 ViewModel 執行個體。不同片段各有所不同。
- activityViewModels() 提供範圍限定於目前活動(activity)的 ViewModel 執行個體。因此,在相同活動中的多個片段中,執行個體會保持不變。
ViewModel 生命週期
活動在進行旋轉然後完成時的不同生命週期狀態 |
ViewModel 存在的時間是從您首次要求 ViewModel 時起算,直到活動完成並刪除為止。
ViewModel 的結束時機包含 :
- 若是活動,則會在完成時。
- 若是片段,則會在卸離時。
- 若是 Navigation 項目,則從返回堆疊中移除時。
其他
每個 layout 都應該有自己的 ViewModel ,避免牽連太廣,不易之後修改。
0 comments:
張貼留言