StateFlowとShareFlow:町における新しいホットストリームAPI



新しく導入されたものの周りにはかなりの宣伝があったStateFlow and SharedFlow アンドロイドコミュニティ.
これらは新しい小林ですFlow エイプ.しかし、これらはありません(すなわち、データが生成されて、加入者があるとき、放出されます).これらは「熱い」ストリームのためです(すなわち、データはとにかく放出されます、そして、どんな活発な加入者もそれらを受け取ります).
これがあなたを思い出させるならばLiveData これは別の“ホット”ストリームの実装であるためです.データはとにかくViewModelから発行され、ビュー内の任意の加入者はそれらの値を取得します.
だから私たちはLiveData with StateFlow ? それは簡単ですか?そして、それは価値がありますか?

ステータスフロー


APIStateFlow とほとんど同じですLiveData . あなたはMutableStateFlow それはStateFlow と同じMutableLiveData ドライブLiveData ).
class MyViewModel(private val repository: Repository) : ViewModel() {

    private val userNameFlow = MutableStateFlow("") // 1.

    val userName: StateFlow<String> = userNameFlow

    init {
        viewModelScope.launch {
            userNameFlow.value = repository.fetchUserName()
        }
    }
}
ビューモデル
class MyActivity : AppCompatActivity() {
    private val viewModel = getViewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        lifecycleScope.launchWhenStarted { // 2.
            viewModel.userName.collect { userName ->
                userNameLabel.text = userName
            }
        }
    }
}
ビュー
  • 対照的にLiveData , StateFlow 常に初期値が必要です.
  • これは少なくともライフサイクルがSTARTED 状態.
  • なお、(2)は問題である.LiveData ビューが停止状態になると自動的に消費者を登録解除します.収集するときStateFlow これは自動的に扱われません.
    この問題に対処するためにどちらかを起動することができますから値を収集停止StateFlow 手動で、またはLiveData 両方の世界のベストを得るためにlifecycle-livedata-ktx ライブラリ)
    class MyActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            viewModel.userName.asLiveData().observe(viewLifecycleOwner) { 
                userName -> userNameLabel.text = userName
            }
        }
    }
    

    シェアフロー


    あなたは考えることができますSharedFlow の一般化としてStateFlow .
  • StateFlow デフォルトでは、新しい加入者があるときに、最後の既知の値を発します.With SharedFlow , どのように多くの以前の値を設定することができます放出される.
  • 値のバッファが一杯のときに何が起こるかを定義できます(例えば、ドロップ値、呼び出し元を停止するなど).
  • それはsubscriptionCount それはビジネスロジックを定義するためにアクティブなコレクターがどれだけ存在するかを示します.
  • それはresetReplayCache() 新しい加入者があるならば、最後の既知の値を出さないために.
  • これは、より高度なユースケースに大きな柔軟性を提供しますLiveData 簡単に実現できません.

    それは価値がありますか?


    アイデアは、我々はJetpackLiveData プラットフォーム独立StateFlow/SharedFlow アプリ(ビュー、モデル、ストレージ)のすべての層で.LiveData Androidのライフサイクルが依存しているので、ビュー/ビューモデルの外でそれを使用するのに適していません.StateFlow APIはほぼLiveDataSharedFlow より高度なユースケースのための柔軟性を提供します.以来、すべての利点を得ることができますLiveData これは、アプリケーションがバックグラウンドに行くときに自動的に購読/購読を解除することです)、これらの新しいAPIは、新しいアプリを構築している場合は、行く方法ですと思います.