diff --git a/buildSrc/src/main/kotlin/deps.kt b/buildSrc/src/main/kotlin/deps.kt index 661aa602..a13252df 100644 --- a/buildSrc/src/main/kotlin/deps.kt +++ b/buildSrc/src/main/kotlin/deps.kt @@ -26,16 +26,16 @@ object appConfig { object deps { object androidx { - const val appCompat = "androidx.appcompat:appcompat:1.3.0-rc01" - const val coreKtx = "androidx.core:core-ktx:1.6.0-alpha03" - const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.0-beta02" - const val recyclerView = "androidx.recyclerview:recyclerview:1.2.0" + const val appCompat = "androidx.appcompat:appcompat:1.4.0-rc01" + const val coreKtx = "androidx.core:core-ktx:1.7.0" + const val constraintLayout = "androidx.constraintlayout:constraintlayout:2.1.1" + const val recyclerView = "androidx.recyclerview:recyclerview:1.2.1" const val swipeRefreshLayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01" - const val material = "com.google.android.material:material:1.4.0-beta01" + const val material = "com.google.android.material:material:1.4.0" } object lifecycle { - private const val version = "2.4.0-alpha01" + private const val version = "2.4.0" const val viewModelKtx = "androidx.lifecycle:lifecycle-viewmodel-ktx:$version" // viewModelScope const val runtimeKtx = "androidx.lifecycle:lifecycle-runtime-ktx:$version" // lifecycleScope @@ -51,7 +51,7 @@ object deps { } object coroutines { - private const val version = "1.5.0" + private const val version = "1.5.2" const val core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version" const val android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$version" @@ -71,7 +71,7 @@ object deps { const val flowExt = "io.github.hoc081098:FlowExt:0.0.7-SNAPSHOT" object arrow { - private const val version = "1.0.0" + private const val version = "1.0.1" const val core = "io.arrow-kt:arrow-core:$version" } diff --git a/core/src/main/java/com/hoc/flowmvi/core/CollectIn.kt b/core/src/main/java/com/hoc/flowmvi/core/CollectIn.kt index da7e2952..13642a10 100644 --- a/core/src/main/java/com/hoc/flowmvi/core/CollectIn.kt +++ b/core/src/main/java/com/hoc/flowmvi/core/CollectIn.kt @@ -4,32 +4,35 @@ import android.util.Log import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.addRepeatingJob +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext +import kotlinx.coroutines.launch inline fun Flow.collectIn( owner: LifecycleOwner, minActiveState: Lifecycle.State = Lifecycle.State.STARTED, - coroutineContext: CoroutineContext = EmptyCoroutineContext, crossinline action: suspend (value: T) -> Unit, -): Job = owner.addRepeatingJob(state = minActiveState, coroutineContext = coroutineContext) { - Log.d("collectIn", "Start collecting...") - collect { action(it) } +): Job = owner.lifecycleScope.launch { + owner.repeatOnLifecycle(state = minActiveState) { + Log.d("collectIn", "Start collecting $owner $minActiveState...") + collect { action(it) } + } } +/** + * Launches a new coroutine and repeats `block` every time the Fragment's viewLifecycleOwner + * is in and out of `minActiveState` lifecycle state. + */ @Suppress("unused") -inline fun Flow.collectIn( +inline fun Flow.collectInViewLifecycle( fragment: Fragment, minActiveState: Lifecycle.State = Lifecycle.State.STARTED, - coroutineContext: CoroutineContext = EmptyCoroutineContext, crossinline action: suspend (value: T) -> Unit, ): Job = collectIn( - fragment.viewLifecycleOwner, + owner = fragment.viewLifecycleOwner, minActiveState = minActiveState, - coroutineContext = coroutineContext, action = action, )