Reactive Store library is an easy reactive solution to state management problems in android development.
- Define Reactive Store
internal interface HomeEvent : Event {
data class InsertUsers(val users: List<User>) : HomeEvent
data class RemoveUser(val id: Int) : HomeEvent
data class ChangeName(val name: String) : HomeEvent
}
internal data class HomeState(
val isLoading: Boolean,
val users: List<User>
) : State {
companion object {
val Idle = HomeState(
isLoading = false,
users = listOf()
)
}
}
internal class HomeReducer : Reducer<HomeState, HomeEvent> {
override fun invoke(store: Store<HomeState, HomeEvent>, event: HomeEvent): HomeState {
return when (event) {
is HomeEvent.InsertUsers -> {
val users = store.state().users
store.state().copy(users = users + event.users)
}
is HomeEvent.RemoveUser -> {
val users = store.state().users.toMutableList()
users.removeIf { it.id == event.id }
store.state().copy(users = users)
}
is HomeEvent.ChangeName -> {
store.state().copy(
users = listOf(
User(
id = 1,
name = event.name
)
)
)
}
else -> store.state()
}
}
}
internal class HomeStore : Store<HomeState, HomeEvent>(
initialState = HomeState.Idle,
reducer = HomeReducer(),
)
- Define and Dispatch
class HomeViewModel() : ViewModel() {
private val store = getStore(default = HomeStore())
fun getUsers() {
val users = api.getUsers()
val event = HomeEvent.ChangeUsers(users = users)
store.dispatch(event)
}
} - Consume State
class MainActivity : AppCompatActivity() {
private val store = getStore(default = HomeStore())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
consumeState(store) { state ->
//ui.render()
}
}
}Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
//...
maven { url 'https://jitpack.io' }
}
}dependencies {
implementation 'com.github.mukuljangir372:Reactive-Store:v1.4'
}