package jp.juggler.subwaytooter.util import androidx.activity.ComponentActivity import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.Lifecycle import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelStoreOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch // ViewModelのfactoryを毎回書くのが面倒 // あと使わない場合にはViewModelの引数を生成したくない fun viewModelFactory(vmClass: Class, creator: () -> VM) = object : ViewModelProvider.NewInstanceFactory() { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { if (!modelClass.isAssignableFrom(vmClass)) { error("unexpected modelClass. ${modelClass.simpleName}") } return creator() as T } } // ViewModelProvider(…).get を毎回書くのが面倒 inline fun provideViewModel( owner: ViewModelStoreOwner, noinline creator: () -> T, ) = ViewModelProvider(owner, viewModelFactory(T::class.java, creator))[T::class.java] inline fun provideViewModel( owner: ViewModelStoreOwner, key: String, noinline creator: () -> T, ) = ViewModelProvider(owner, viewModelFactory(T::class.java, creator))[key, T::class.java] fun AppCompatActivity.collectOnLifeCycle( flow: Flow, state: Lifecycle.State = Lifecycle.State.STARTED, block: suspend (T) -> Unit, ) = lifecycleScope.launch { lifecycle.repeatOnLifecycle(state = state) { flow.collect { block(it) // Viewの更新 } } } fun ComponentActivity.collectOnLifeCycle( flow: Flow, state: Lifecycle.State = Lifecycle.State.STARTED, block: suspend (T) -> Unit, ) = lifecycleScope.launch { lifecycle.repeatOnLifecycle(state = state) { flow.collect { block(it) // Viewの更新 } } }