Lilly
05/06/2022, 11:19 PMstateIn.
1. Is this a bad approach:
// presenter/viewmodel:
val myState: StateFlow<MyState> = api.subscribeToFlow()
.map {..}
.stateIn(scope = mainScope + Dispatcher.Default, started = SharingStarted.Lazily, initalValue = MyState.Initial)
// somewhere else:
fun subscribeToFlow(): Flow<Int> {
println("thread: ${Thread.currentThread()}.") // prints main thread
...
return someFlow()
}
I'm asking because the call to api.subscribeToFlow() runs in main thread and I don't know how to make it switch to a default thread. I could wrap everything in withContext() in my subscribeToFlow() function but is there an alternative? This brings me to my 2nd question.
2. What is a use case for the overloaded suspend stateIn(scope: CoroutineScope) function? It requires to be called from a suspension function while the simple stateIn function does not.julian
05/07/2022, 12:51 AMsubscribeToFlow is called, but the thread/dispatcher on which collection occurs, or any context changes in the flow stream. You're doing neither in subscribeToFlow.
And you're already switching to the default dispatcher with stateIn, so you're all set.
According to the stateIn docs
Starts the upstream flow in a given scope ...So the flow upstream of
map should run on the default dispatcher. Verify by putting an onEach upstream of map and see what thread is being used.
The flow is constructed on the main thread, true; but it doesn't run (i.e. it is not started) on the main thread.