Mark
12/05/2020, 10:29 AMCoroutineScope
for a Koin Scope
?Saul Wiggin
12/05/2020, 2:43 PMval scope = getKoin().createScope<A>() scope.close()
Close the Coroutine scope val coroutineScope = CoroutineScope(Job() + dispatchers.Main) coroutineScope.cancel()
Mark
12/05/2020, 2:59 PMSupervisorJob()
and Dispatchers.Main.immediate
since that it what ViewModel.viewModelScope
uses? Maybe also use by lazy
since there is no point creating the scope unnecessarily.Mark
12/05/2020, 3:12 PMscope(navQualifier(R.id.nav_item)) {
scoped { (coroutineScope: CoroutineScope) ->
MyModel(someArg = get(), coroutineScope)
}
}
// fragment
val viewModel by navGraphInstances<MyModel>(R.id.nav_item)
// common code
inline fun <reified T : Any> Fragment.navGraphInstances(
@IdRes navGraphId: Int
): Lazy<T> = lazy {
val holder by navGraphViewModels<NavGraphScopeHolder>(navGraphId) {
object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T =
NavGraphScopeHolder(navGraphId) as T
}
}
holder.scope.get { parametersOf(holder.viewModelScope) }
}
class NavGraphScopeHolder(@IdRes navGraphId: Int) : ViewModel() {
val scope = GlobalContext.get().getOrCreateScope(
navScopeId(navGraphId),
navQualifier(navGraphId)
)
override fun onCleared() {
scope.close()
}
}
fun navQualifier(navGraphId: Int) = named("NavQualifier (NavGraphId@$navGraphId)")
fun navScopeId(navGraphId: Int): ScopeID = "NavScopeId (NavGraphId@$navGraphId)"
Saul Wiggin
12/05/2020, 3:27 PMMark
12/05/2020, 3:39 PMSaul Wiggin
12/05/2020, 3:46 PMMark
12/05/2020, 4:04 PMviewModelScope
because that is done for us since we are making use of Android’s ViewModel