🙆
asStateFlowとasSharedFlowが何をやっているのか?
ViewModelで、stateFlowやSharedFlowを使用するときに、下記のような感じで書くときに出てくるasStateFlow
やasSharedFlow
がなんとなく使っていたので、どういった処理が内部で行われているのか見てみました。
val _uiState = MutableStateFlow<UiState>(UiState.Proceeding)
val uiState: StateFlow<UiState>() = _uiState.asStateFlow()
asStateFlow、asSharedFlowって何をやっているのか?
実際に、asStateFlow
とasSharedFlow
の中身を見てみると、、、
private class ReadonlySharedFlow<T>(
flow: SharedFlow<T>,
@Suppress("unused")
private val job: Job? // keeps a strong reference to the job (if present)
) : SharedFlow<T> by flow, CancellableFlow<T>, FusibleFlow<T> {
override fun fuse(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow) =
fuseSharedFlow(context, capacity, onBufferOverflow)
}
private class ReadonlyStateFlow<T>(
flow: StateFlow<T>,
@Suppress("unused")
private val job: Job? // keeps a strong reference to the job (if present)
) : StateFlow<T> by flow, CancellableFlow<T>, FusibleFlow<T> {
override fun fuse(context: CoroutineContext, capacity: Int, onBufferOverflow: BufferOverflow) =
fuseStateFlow(context, capacity, onBufferOverflow)
}
こんな感じになってました。
Mutableな値が内部で、Readonly
になっているようです。
val
になってるなら変更できないんじゃないか?と思ったんですが、val
はフィールドに別の値を設定できないことを意味するらしく、フィールドに対して操作を実行することはできるらしいです。
Readonly
になると、操作を実行することを制御するということもできるようになり、安全性が増すということがわかりました。
参考
Discussion