2023年9月21日 星期四

【Android】 ViewModel、【Kotlin】委託(delegate)


添加依賴

// 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:

張貼留言