FlowUseCase usage
Define FlowUseCase
FlowUseCase is a abstract class with one abstract function. It has two generic parameters. The first is to define
Argument type, the second is to define Return type. FlowUseCase will always return a flow of defined return type.
The flow will be executed on non-ui thread. Don't forget to freeze()
the FlowUseCase in init
block.
Any properties has to be initialized/injected above the init block because of freezing.
// shared/src/commonMain/../domain/
class ObserveCoinsUseCase : FlowUseCase<Unit, List<Coin>>() {
private val coinStore: CoinStore = CoinStore(RestApiManager, DatabaseManager)
init {
freeze()
}
override fun build(arg: Unit): Flow<List<Coin>> {
println("ObserveCoinsUseCase building...")
return coinStore.observeCoins()
}
}
Note that only the flow will be executed on non-ui thread. The rest of the build
function will be executed on UI thread.
Execute FlowUseCase
To be able to execute the FlowUseCase you have to be in the scope of CoroutineScopeOwner
. On the Android side
you can take advantage of viewModelScope
from Android Architecture Components (AAC). On the iOS side
you can use ArkitektViewModel
from km-viewmodel
. If you need to execute the FlowUseCase outside of ViewModel,
e.g. in a Service, you need to implement CoroutineScopeOwner
and provide CoroutineScope
by yourself.
Usage on Android
Define a BaseViewModel:
// androidApp
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.futured.arkitekt.kmusecases.scope.CoroutineScopeOwner
abstract class BaseViewModel : ViewModel(), CoroutineScopeOwner {
override val coroutineScope = viewModelScope
}
Execute the UseCase:
class CoinsViewModel : BaseViewModel() {
private val observeCoinsUseCase = ObserveCoinsUseCase()
var coins by mutableStateOf(emptyList<Coin>())
var isLoading by mutableStateOf(false)
fun fetchCoins() {
observeCoinsUseCase.execute(Unit) {
onStart { isLoading = true }
onNext {
coins = it
isLoading = false
}
onError {
isLoading = false
println(it.message)
}
}
}
}
Usage on iOS
// iosApp
import shared
class BaseViewModel : Km_viewmodelArkitektViewModel {
deinit {
onDestroy()
}
}
Execute the UseCase:
// iosApp
import shared
class CoinsViewModel : BaseViewModel, ObservableObject {
@Published var coins = [Coin]()
private let getCoinsUseCase = GetCoinsListUseCase()
func getCoins() {
getCoinsUseCase.execute(self, args: KotlinUnit()) {
$0.onSuccess { list in
self.coins = list as [Coin]
}
$0.onError { error in
print(error)
}
}
}
}
UseCase usage
Head out to UseCase section.
Example
Check out the usage in the example