FlowReduxDsl

FlowRedux-DSL

License

License

Categories

Categories

ORM Data
GroupId

GroupId

com.freeletics.flowredux
ArtifactId

ArtifactId

dsl-multiplatform
Last Version

Last Version

0.3.0
Release Date

Release Date

Type

Type

pom
Description

Description

FlowReduxDsl
FlowRedux-DSL
Project URL

Project URL

http://github.com/freeletics/FlowRedux/
Source Code Management

Source Code Management

http://github.com/freeletics/FlowRedux/

Download dsl-multiplatform

How to add to project

<!-- https://jarcasting.com/artifacts/com.freeletics.flowredux/dsl-multiplatform/ -->
<dependency>
    <groupId>com.freeletics.flowredux</groupId>
    <artifactId>dsl-multiplatform</artifactId>
    <version>0.3.0</version>
    <type>pom</type>
</dependency>
// https://jarcasting.com/artifacts/com.freeletics.flowredux/dsl-multiplatform/
implementation 'com.freeletics.flowredux:dsl-multiplatform:0.3.0'
// https://jarcasting.com/artifacts/com.freeletics.flowredux/dsl-multiplatform/
implementation ("com.freeletics.flowredux:dsl-multiplatform:0.3.0")
'com.freeletics.flowredux:dsl-multiplatform:pom:0.3.0'
<dependency org="com.freeletics.flowredux" name="dsl-multiplatform" rev="0.3.0">
  <artifact name="dsl-multiplatform" type="pom" />
</dependency>
@Grapes(
@Grab(group='com.freeletics.flowredux', module='dsl-multiplatform', version='0.3.0')
)
libraryDependencies += "com.freeletics.flowredux" % "dsl-multiplatform" % "0.3.0"
[com.freeletics.flowredux/dsl-multiplatform "0.3.0"]

Dependencies

There are no dependencies for this project. It is a standalone project that does not depend on any other jars.

Project Modules

There are no modules declared in this project.

FlowRedux

Download

Building async. running Kotlin Multiplatform state machine made easy with a DSL and coroutines.

Usage

Full documentation and best bractices can be found here: https://freeletics.github.io/FlowRedux/

sealed class State

object LoadingState : State()
data class ContentState(val items : List<Item>) : State()
data class ErrorState(val error : Throwable) : State()


sealed class Action
object RetryLoadingAction : Action()


class MyStateMachine : FlowReduxStateMachine<State, Action>(LoadingState){
    init {
        spec {
            inState<LoadingState> {
                onEnter { stateSnapshot : LoadingState ->
                    // executes this block whenever we enter LoadingState
                    try {
                        val items = loadItems() // suspending function / coroutine to load items
                        OverrideState( ContentState(items) ) // Transition to ContentState
                    } catch (t : Throwable) {
                        OverrideState( ErrorState(t) ) // Transition to ErrorState
                    }
                }
            }

            inState<ErrorState> {
                on<RetryLoadingAction> { action : RetryLoadingAction, stateSnapshot : ErrorState ->
                    // executes this block whenever ErrorState is current state and RetryLoadingAction is emitted
                    OverrideState( LoadingState ) // Transition to LoadingState which loads list again
                 }
            }

            inState<ContentState> {
                collectWhileInState( flowOf(1,2,3) ) { value : Int, stateSnapshot : ContentState ->
                    // observes the given flow as long as state is ContentState.
                    // Once state is changed to another state the flow will automatically
                    // stop emitting.
                    MutateState<ContentState, State> { 
                        copy( items = this.items + Item("New item $value"))
                    }
                }
            }
        }
    }
}
val statemachine = MyStateMachine()

launch {  // Launch a coroutine
    statemachine.state.collect { state ->
      // do something with new state like update UI
      renderUI(state)
    }
}

// emit an Action
launch { // Launch a coroutine
    statemachine.dispatch(Action)
}

In an Android Application you could use it with AndroidX ViewModel like that:

class MyViewModel @Inject constructor(private val stateMachine : StateMachine) : ViewModel() {
    val state = MutableLiveData<State>()

    init {
        viewModelScope.launch { // automatically canceled once ViewModel lifecycle reached destroyed.
            stateMachine.state.collect { newState ->
                state.value = newState
            }
        }
    }

    fun dispatch(action : Action) {
        viewModelScope.launch {
            stateMachine.dispatch(action)
        }
    }
}

Dependencies

There are two artifacts that you can include as dependency::

  1. flowredux: this is the core library. Usually you dont want to use the core library directly but rather use the dsl.
  2. dsl which provides a convenient DSL on top of the core library. Usually this is what you want.

Multiplatform

implementation 'com.freeletics.flowredux:flowredux:0.5.0'
implementation 'com.freeletics.flowredux:dsl:0.5.0'

JVM only

implementation 'com.freeletics.flowredux:flowredux-jvm:0.5.0'
implementation 'com.freeletics.flowredux:dsl-jvm:0.5.0'

Native binaries

implementation 'com.freeletics.flowredux:flowredux-iosx64:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-iosarm64:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-iosarm32:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-watchosx86:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-watchosarm64:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-watchosarm32:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-tvosx64:0.5.0'
implementation 'com.freeletics.flowredux:flowredux-tvosxarm64:0.5.0'

implementation 'com.freeletics.flowredux:dsl-iosx64:0.5.0'
implementation 'com.freeletics.flowredux:dsl-iosarm64:0.5.0'
implementation 'com.freeletics.flowredux:dsl-iosarm32:0.5.0'
implementation 'com.freeletics.flowredux:dsl-watchosx86:0.5.0'
implementation 'com.freeletics.flowredux:dsl-watchosarm64:0.5.0'
implementation 'com.freeletics.flowredux:dsl-watchosarm32:0.5.0'
implementation 'com.freeletics.flowredux:dsl-tvosx64:0.5.0'
implementation 'com.freeletics.flowredux:dsl-tvosxarm64:0.5.0'

JavaScript

No javascript version release yet but its on our TODO list.

Snapshot

Latest snapshot (directly published from master branch from Travis CI):

allprojects {
    repositories {
        // Your repositories.
        // ...
        // Add url to snapshot repository
        maven {
            url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }
}

Then just use -SNAPSHOTsuffix as version like

implementation 'com.freeletics.flowredux:dsl:0.5.1-SNAPSHOT'
com.freeletics.flowredux

Freeletics

Freeletics is more than an app. It's a lifestyle powered by one of the most passionate and dedicated communities in the world.

Versions

Version
0.3.0
0.2.1
0.2.0