Kotlinマルチプラットフォーム用の簡単なリアクティブ状態管理とビューモデル。ボイラープレートはありません。 Androidと互換性があります。
Reactivestate-Kotlinは、マルチプラットフォームビューモデルと下位レベルのロジックを構築するためのこれらの基礎を提供します。
CoroutineDispatcher渡すことを心配しないでください詳細については、Reactivestateドキュメントを参照してください。
Android、JVM、iOS、TVOS、WatchOS、MacOSARM64、MacOSX64、MINGWX64、LinuxX64
build.gradleのdependencies {}にパッケージを追加します。
dependencies {
// Add the BOM using the desired ReactiveState version
api platform( " com.ensody.reactivestate:reactivestate-bom:VERSION " )
// Leave out the version number from now on:
implementation " com.ensody.reactivestate:reactivestate "
// Utils for unit tests that want to use coroutines
implementation " com.ensody.reactivestate:reactivestate-test "
// Note: kotlin-coroutines-test only supports the "jvm" target,
// so reactivestate-test has the same limitation
}また、Maven Central Repoを統合していることを確認してください。たとえば、Root build.gradle :
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}次の2つの原則は、リアクティブプログラミングの側面のみを簡単に説明するためにここにあります。ドキュメントの「ガイド」セクションでは、マルチプラットフォームビューモデル、ライフサイクル処理など、より高度な側面を使用する方法について説明します。
注:議論はStateFlowに関するものですが、 LiveDataを使用したり、他の観察可能な値に拡張機能を実装することもできます。
最初の名前と姓の入力フォームがあり、同時に2つのStateFlow値を観察したいと想像してください。
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean>これは、 autoRun関数を使用してそれを行う方法です。
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} get(isFirstNameValid)を使用すると、 isFirstNameValid.valueを取得し、同時に、値が変更されるたびにブロックを再実行するようにautoRunに指示します。そのコードはこれを書くことに似ています:
lifecycleScope.launchWhenStarted {
isFirstNameValid
.combine(isLastNameValid) { firstNameValid, lastNameValid ->
firstNameValid to lastNameValid
}
.conflate()
.collect { (firstNameValid, lastNameValid) ->
try {
submitButton.isEnabled = firstNameValid && lastNameValid
} catch (e : CancellationException ) {
throw e
} catch (e : Throwable ) {
onError(e)
}
}
}同じ原理を使用して、 derivedしたリアクティブStateFlowを作成できます。
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
}これで、コードの残りの部分でautoRun { submitButton.isEnabled = get(isFormValid) }を使用できます。
さらに進むと、 isFirstNameValid自体は通常、 derived計算の結果でもあります。したがって、反応性derived StateFlowの複数の層を持つことができます。
JetPackのような反応性UIフレームワークは、たとえばStateFlowが変更されるたびにUIを自動的に再構築します。したがって、UIレイヤーでは、通常、 autoRunをComposableものに置き換えることができます。
ただし、UI以下では、データもリアクティブである必要があります。ここで、Reactivestateは、他のStateFlowに基づいてStateFlow自動的に再計算するためにderivedを提供します。このパターンは、実際には非常に有用であり、主にUIの側面に焦点を当てたJetpack Composeのようなフレームワークの完璧な基盤を提供します。 ReactivestateのderivedとautoRun 、データとビジネスロジックに対して同じ反応性を提供します。
Jetpackでは、 derivedに非常に似ているderivedStateOfさえ持っています。したがって、公式のCoroutinesライブラリ( StateFlow / derived )またはJetPack Compose( State / derivedStateOf )に基づいてビジネスロジックを構築するかどうかを選択できます。ただし、Coroutinesライブラリには、より多くのプラットフォームが利用できるという利点があり、UIフレームワークから完全に独立しています。最後に、ほとんどのオープンソース非UIライブラリはおそらくCoroutinesに基づいているため、 StateFlowベースのコードは互換性/相互運用性の向上にも優れている可能性があります。
言い換えれば、一緒に使用される両方のソリューションの組み合わせにより、完全に反応性のあるマルチプラットフォームコードベースが得られます。これにより、コードのシンプルさが向上し、多くのバグが回避されます。
さらに、JetPack Composeは現在、マルチプラットフォームのViewModelサポートや大規模なアーキテクチャを提供していません。したがって、このライブラリは、ViewModelsにBaseReactiveState提供することにより、それを解決します。また、ライフサイクルを意識したイベントシステム( eventNotifier )と状態処理をロードすることも伴います(したがって、発売するコルーチンに基づいて1つまたは複数の異なるロードインジケーターを追跡できます)。
このライブラリは、FlutterのReactive_Stateに基づいており、Kotlin MultiplatformおよびAndroidパターンに適合しています。
Copyright 2024 Ensody GmbH, Waldemar Kornewald
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.