Kotlin Multiplatform의 쉬운 반응 상태 관리 및 뷰 모델. 보일러 플레이트가 없습니다. 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()
// ...
}
}다음 두 가지 원칙이 여기에 있습니다. 문서의 "가이드"섹션은 멀티 플랫폼 뷰 모델, 라이프 사이클 핸들링 등과 같은 고급 측면으로 작업하는 방법을 설명합니다.
참고 : 논의는 StateFlow 에 관한 것이지만 LiveData 사용하거나 다른 관찰 가능한 값에 대한 확장을 구현할 수도 있습니다.
이름과 성이있는 입력 양식이 있고 동시에 두 개의 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 제공합니다. 이 패턴은 실제로 매우 유용하며 Jetpack Compose와 같은 프레임 워크를위한 완벽한 기초를 제공하여 주로 UI 측면에 중점을 둡니다. ReactiveState의 derived 및 autoRun 귀하의 데이터 및 비즈니스 로직에 대해 동일한 반응성을 제공합니다.
Jetpack Compose에서는 derived 것과 매우 유사한 derivedStateOf 가지고 있습니다. 따라서 공식 Coroutines 라이브러리 ( StateFlow / derived ) 또는 JetPack Compose ( State / derivedStateOf )를 기반으로 비즈니스 논리를 구축할지 여부를 선택할 수 있습니다. 그러나 Coroutines 라이브러리는 더 많은 플랫폼에서 사용할 수 있다는 장점이 있으며 UI 프레임 워크와 완전히 독립적입니다. 마지막으로, 대부분의 오픈 소스 비 UI 라이브러리는 아마도 코 루틴을 기반으로하므로 StateFlow 기반 코드도 호환성/상호 운용성에 더 좋을 수 있습니다.
다시 말해, 함께 사용 된 두 솔루션의 조합은 완전히 반응성이 뛰어나고 멀티 플랫폼 코드베이스를 초래하여 코드 단순성을 향상시키고 많은 버그를 피합니다.
또한 JetPack Compose는 현재 다중 플랫폼 뷰 모델 지원 또는 대규모 아키텍처를 제공하지 않습니다. 따라서이 라이브러리는 ViewModels에 BaseReactiveState 제공함으로써이를 해결합니다. 또한 수명주기 인식 이벤트 시스템 ( eventNotifier )과 로딩 상태 처리 (따라서 출시 된 코 루틴을 기반으로 하나 또는 여러 개의 다른 로딩 표시기를 추적 할 수 있음)와 함께 제공됩니다.
이 라이브러리는 Flut
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.