FlowRedux
用 DSL 和协程轻松构建异步运行的 Kotlin Multiplatform 状态机。
使用
完整的文档和最佳实践可在此处找到:https://freeletics.github.io/FlowRedux/
sealed interface State
object Loading : State
data class ContentState(val items : List<Item>) : State
data class Error(val error : Throwable) : State
sealed interface Action
object RetryLoadingAction : Action
class MyStateMachine : FlowReduxStateMachine<State, Action>(initialState = Loading){
init {
spec {
inState<Loading> {
onEnter { state : State<Loading> ->
// 每当我们进入 Loading 状态时执行此代码块
try {
val items = loadItems() // 挂起函数/协程加载项
state.override { ContentState(items) } // 过渡到 ContentState
} catch (t : Throwable) {
state.override { Error(t) } // 过渡到 Error 状态
}
}
}
inState<Error> {
on<RetryLoadingAction> { action : RetryLoadingAction, state : State<Error> ->
// 每当当前状态为 Error 且 RetryLoadingAction 被触发时执行此代码块
state.override { Loading } // 过渡到 Loading 状态,再次加载列表
}
}
inState<ContentState> {
collectWhileInState( flowOf(1,2,3) ) { value : Int, state : State<ContentState> ->
// 只要状态是 ContentState,就观察给定的 flow。
// 一旦状态变成其他状态,flow 会自动停止发出。
state.mutate {
copy( items = this.items + Item("New item $value"))
}
}
}
}
}
}
val statemachine = MyStateMachine()
launch { // 启动一个协程
statemachine.state.collect { state ->
// 对新状态执行某些操作,例如更新 UI
renderUI(state)
}
}
// 触发一个 Action
launch { // 启动一个协程
statemachine.dispatch(action)
}
在 Android 应用程序中,你可以这样使用 AndroidX ViewModel
:
class MyViewModel @Inject constructor(private val stateMachine : MyStateMachine) : ViewModel() {
val state = MutableLiveData<State>()
init {
viewModelScope.launch { // 一旦 ViewModel 生命周期到达销毁状态,自动取消
stateMachine.state.collect { newState ->
state.value = newState
}
}
}
fun dispatch(action : Action) {
viewModelScope.launch {
stateMachine.dispatch(action)
}
}
}
依赖项
有两个工件可以作为依赖项包含:
flowredux
:这是核心库,包含 DSL。compose
:包含一些方便的扩展,用于在 Jetpack Compose 中与FlowReduxStateMachine
配合使用。
仅 JVM / Android
implementation 'com.freeletics.flowredux:flowredux-jvm:<latest-version>'
implementation 'com.freeletics.flowredux:compose:<latest-version>'
多平台
implementation 'com.freeletics.flowredux:flowredux:<latest-version>'
FlowRedux 支持以下平台:
- JVM / Android
- iOS
- watchOS
- tvOS
- macOS
- Linux
- Windows
我们计划添加 JavaScript 支持,但目前尚不可用。
快照
最新快照(从每次更改的 CI 中直接发布自 main
分支):
allprojects {
repositories {
// 你的仓库。
// ...
// 添加快照仓库的 URL
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
}
}
然后用版本名中的 -SNAPSHOT
后缀,例如:
implementation 'com.freeletics.flowredux:flowredux:1.2.1-SNAPSHOT'