今になって、Android SDK の根本的な
「ライフサイクル」
「フラグメント」
「バックスタック」
とかで苦労すること多くなってきました。
👉 Handling Lifecycles with Lifecycle-Aware Components
ライフサイクルやそのオーナーの状況変化具合を眺めながら進みたいですよね?
意外と使える androidx.lifecycle.* 。
今更か。
今になって、Android SDK の根本的な
「ライフサイクル」
「フラグメント」
「バックスタック」
とかで苦労すること多くなってきました。
👉 Handling Lifecycles with Lifecycle-Aware Components
ライフサイクルやそのオーナーの状況変化具合を眺めながら進みたいですよね?
意外と使える androidx.lifecycle.* 。
今更か。
どう書くべきでしょうか、リポジトリが返す Result。
data クラス で書きますか?
それとも、Kotlin ビルトインのを使いますか?
👉 Result - Kotlin Programming Language
enum の拡張的なイメージで使いましょう、
👉 Sealed Classes - Kotlin Programming Language
👉 architecture-samples/Result.kt
できるだけ長く広く便利に使えるものがいいですよね。
👉 Using LiveData & Flow in MVVM — Part I - ProAndroidDev
Kotlin Flow の登場で盛り上がってきました。
どれにします? どの流れにします?
Result を返す。
Flow<Result>を返す。
Result を受けて、LiveData<Result> を渡す。
Flow<Result> を受けて、LiveData<Result> を渡す。
LiveData<Result> を受け取る。
Flow<Result> を受け取る。
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(
this,
viewModelFactory
).get(WeatherForecastDataStreamFlowViewModel::class.java)
// Consume data when fragment is started
lifecycleScope.launchWhenStarted {
// Since collect is a suspend function it needs to be called
// from a coroutine scope
viewModel.weatherForecast.collect {
when (it) {
Result.Loading -> {
Toast.makeText(context, "Loading", Toast.LENGTH_SHORT).show()
}
is Result.Success -> {
tvDegree.text = it.data.toString()
}
Result.Error -> {
Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show()
}
}
}
}
}
WeatherForecastDataStreamFlowFragment #L47-L75
とはいえ、今はまだ、完全に LiveData は捨てれんよの。
👉 Kotlin で Result
👉 Kotlin Flow vs Android LiveData - Stack Overflow
👉 From RxJava 2 to Kotlin Flow: Threading - ProAndroidDev