FlowState

This commit is contained in:
InsanusMokrassar 2023-11-29 23:54:27 +06:00
parent 9b30c3a155
commit 22d7ac3e22
3 changed files with 58 additions and 11 deletions

View File

@ -0,0 +1,43 @@
package dev.inmo.micro_utils.coroutines.compose
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.derivedStateOf
import dev.inmo.micro_utils.coroutines.SpecialMutableStateFlow
import dev.inmo.micro_utils.coroutines.doInUI
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
class FlowState<T>(
private val state: MutableState<T>,
internalScope: CoroutineScope = CoroutineScope(Dispatchers.Main)
) : MutableState<T>,
SpecialMutableStateFlow.Default<T>(state.value, internalScope) {
override var value: T
get() = super.value
set(value) {
tryEmit(value)
}
override fun component1(): T = state.component1()
override fun component2(): (T) -> Unit = state.component2()
private val stateState = derivedStateOf {
if (value != state.value) {
value = state.value
}
}
override suspend fun onChange(value: T) {
super.onChange(value)
if (state.value != value) {
doInUI {
state.value = value
}
}
}
}
fun <T> MutableState<T>.asFlowState(scope: CoroutineScope = CoroutineScope(Dispatchers.Main)) = FlowState(this, scope)

View File

@ -10,27 +10,31 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
interface SpecialMutableStateFlow<T> : StateFlow<T>, FlowCollector<T>, MutableSharedFlow<T> { interface SpecialMutableStateFlow<T> : StateFlow<T>, FlowCollector<T>, MutableSharedFlow<T> {
class Default<T>( open class Default<T>(
initialValue: T, initialValue: T,
internalScope: CoroutineScope = CoroutineScope(Dispatchers.Default) internalScope: CoroutineScope = CoroutineScope(Dispatchers.Default)
) : SpecialMutableStateFlow<T> { ) : SpecialMutableStateFlow<T> {
private val internalSharedFlow: MutableSharedFlow<T> = MutableSharedFlow( protected val internalSharedFlow: MutableSharedFlow<T> = MutableSharedFlow(
replay = 0, replay = 0,
extraBufferCapacity = 1, extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST onBufferOverflow = BufferOverflow.DROP_OLDEST
) )
private val publicSharedFlow: MutableSharedFlow<T> = MutableSharedFlow( protected val publicSharedFlow: MutableSharedFlow<T> = MutableSharedFlow(
replay = 1, replay = 1,
extraBufferCapacity = 1, extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST onBufferOverflow = BufferOverflow.DROP_OLDEST
) )
override var value: T = initialValue protected var _value: T = initialValue
private set override val value: T
private val job = internalSharedFlow.subscribe(internalScope) { get() = _value
if (value != it) { protected open suspend fun onChange(value: T) {
value = it _value = value
publicSharedFlow.emit(it) publicSharedFlow.emit(value)
}
protected val job = internalSharedFlow.subscribeSafelyWithoutExceptions(internalScope) {
if (_value != it) {
onChange(it)
} }
} }

View File

@ -7,7 +7,7 @@ kt-coroutines = "1.7.3"
kslog = "1.3.1" kslog = "1.3.1"
jb-compose = "1.5.11" jb-compose = "1.5.11"
jb-exposed = "0.44.1" jb-exposed = "0.45.0"
jb-dokka = "1.9.10" jb-dokka = "1.9.10"
korlibs = "4.0.10" korlibs = "4.0.10"
@ -21,7 +21,7 @@ koin = "3.5.0"
okio = "3.6.0" okio = "3.6.0"
ksp = "1.9.20-1.0.14" ksp = "1.9.21-1.0.15"
kotlin-poet = "1.15.1" kotlin-poet = "1.15.1"
versions = "0.50.0" versions = "0.50.0"