Files
tubestation/mobile/android/android-components/components/lib/state
Sebastian Kaspari f14b267388 [components] Issue https://github.com/mozilla-mobile/android-components/issues/10335: Update dependencies to support Jetpack Compose and add first prototype components.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Upgrade to Gradle 7.
* Update Android Gradle Plugin to 7.0.0 Beta 2.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Generate BuildConfig with VERSION_CODE and VERSION_NAME fields in library modules (for Glean).
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Add first component using Jetpack Compose: compose-browser-toolbar.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Introduce Jetpack Compose bindings for lib-state.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Upstream Jetpack Compose toolbar prototype from Reference Browser.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Add TargetTab helper for observing specific tabs.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Add compose-engine component for adding Jetpack Compose bindings to a concept-engine implementation.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Add new sample app (samples-compose-browser) for prototyping browser UI using Jetpack Compose.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Update to Beta 3 of the Android Gradle plugin.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Allow usage of http when substituting maven repositories in CI.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Rename TabTarget helper to just Target.
* Issue https://github.com/mozilla-mobile/android-components/issues/10335: Make BrowserToolbar follow target tab too.
* Add awesomebar prototype using Jetpack Compose.
* Update to Gradle 7.0.2.
2021-07-20 16:22:26 +00:00
..

Android Components > Libraries > State

A generic library for maintaining the state of a component, screen or application.

The state library is inspired by existing libraries like Redux and provides a Store class to hold application state.

Usage

Setting up the dependency

Use Gradle to download the library from maven.mozilla.org (Setup repository):

implementation "org.mozilla.components:lib-state:{latest-version}"

Action

Actions represent payloads of information that send data from your application to the Store. You can send actions using store.dispatch(). An Action will usually be a small data class or object describing a change.

data class SetVisibility(val visible: Boolean) : Action

store.dispatch(SetVisibility(true))

Reducer

Reducers are functions describing how the state should change in response to actions sent to the store.

They take the previous state and an action as parameters, and return the new state as a result of that action.

fun reduce(previousState: State, action: Action) = when (action) {
    is SetVisibility -> previousState.copy(toolbarVisible = action.visible)
    else -> previousState
}

Store

The Store brings together actions and reducers. It holds the application state and allows access to it via the store.state getter. It allows state to be updated via store.dispatch(), and can have listeners registered through store.observe().

Stores can easily be created if you have a reducer.

val store = Store<State, Action>(
    initialState = State(),
    reducer = ::reduce
)

Once the store is created, you can react to changes in the state by registering an observer.

store.observe(lifecycleOwner) { state ->
    toolbarView.visibility = if (state.toolbarVisible) View.VISIBLE else View.GONE
}

store.observe is lifecycle aware and will automatically unregister when the lifecycle owner (such as an Activity or Fragment) is destroyed. Instead of a LifecycleOwner, a View can be supplied instead.

If you wish to manually control the observer subscription, you can use the store.observeManually function. observeManually returns a Subscription class which has an unsubscribe method. Calling unsubscribe removes the observer.

License

This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/