Kotlin MVI framework
In progress. README is lean and will be updated later.
// build.gradle.kts
implementation("dev.sunnyday.arch-mvi:mvi-core:$version")
implementation("dev.sunnyday.arch-mvi:mvi-kit-coroutine:$version")
// Somewhere in the code
import dev.sunnyday.arch.mvi.coroutine.setupFactories
import dev.sunnyday.arch.mvi.MviKit
fun initMvi() {
MviKit.setupFactories()
}
fun startFeature(featureCoroutineScope: CoroutineScope): MviFeature<State, InputEvent> {
// null can be skipped, just showed that they are
val starter = MviKit.withParentCoroutine(featureCoroutineScope)
.createFeatureStarter<State, InputEvent, Event, SideEffect>(
initialStateProvider = { State("initial") },
initialEventsProvider = null,
initialInputEventsProvider = null,
initialSideEffectsProvider = null,
stateMachineInstanceFactory = { // this: StateMachineInstanceFactory.FactoryScope -> // with createStateMachine method
createStateMachine(
reducer = FeatureReducer(),
stateTransitionListener = null,
)
},
featureInstanceFactory = { // this: FeatureInstanceFactory.FactoryScope -> // with createFeature method
createFeature(
eventHandler = FeatureInputEventHandler(),
sideEffectHandler = FeatureSideEffectHandler(),
onReadyCallback = null,
)
}
)
return starter.start()
}
// Or minimal, even without EventHandler
fun startFeature(): MviFeature<State, Event> {
val starter = MviKit.createFeatureStarter<State, Event, Event, SideEffect>(
initialStateProvider = { State("initial") },
stateMachineInstanceFactory = {
createStateMachine(
reducer = FeatureReducer(),
)
},
featureInstanceFactory = {
createFeature(
sideEffectHandler = FeatureSideEffectHandler(),
)
}
)
return starter.start()
}
A state machine or feature can be instantiated independently using own MviKit's factory method.