سهلة إدارة الدولة و iewmodels ل 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
} تأكد build.gradle
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}المبدأان التاليان موجودان هنا لإعطائك فكرة سريعة عن جانب البرمجة التفاعلية فقط. يصف قسم "الدليل" في الوثائق كيفية العمل مع الجوانب الأكثر تقدماً مثل Multiplatform ViewModels ، ومعالجة دورة الحياة ، إلخ.
ملاحظة: على الرغم من أن المناقشة تدور حول 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)
}
}
} يمكن استخدام نفس المبدأ لإنشاء StateFlow derived وتفاعلي:
val isFormValid : StateFlow < Boolean > = derived {
get(isFirstNameValid) && get(isLastNameValid)
} يمكنك الآن استخدام autoRun { submitButton.isEnabled = get(isFormValid) } في بقية الكود الخاص بك.
الذهاب إلى أبعد من ذلك ، فإن isFirstNameValid نفسها عادة ما تكون أيضًا نتيجة لحساب derived . لذلك ، يمكنك الحصول على طبقات متعددة من StateFlow derived التفاعلية.
تقوم أطر عمل واجهة المستخدم التفاعلية مثل JetPack بتأليف إعادة بناء واجهة المستخدم تلقائيًا كلما تغير StateFlow . لذلك ، في طبقة واجهة المستخدم ، يمكن استبدال autoRun عادةً بكونها Composable .
ومع ذلك ، أسفل واجهة المستخدم ، لا تزال بياناتك يجب أن تكون تفاعلية أيضًا. يوفر Reactivestate هنا derived لإعادة حساب StateFlow تلقائيًا استنادًا إلى تدفقات StateFlow الأخرى. يعد هذا النمط مفيدًا جدًا في الممارسة العملية ويوفر الأساس المثالي للأطر مثل Jetpack التي تركز بشكل أساسي على جانب واجهة المستخدم. توفر Reactivestate derived autoRun نفس التفاعل لبياناتك ومنطق العمل.
في jetpack compose لك حتى أن لديك derivedStateOf والتي تشبه إلى حد كبير derived . لذلك ، يمكنك اختيار ما إذا كنت تريد إنشاء منطق عملك بناءً على مكتبة Coroutines الرسمية ( StateFlow / derived ) أو JetPack Compose ( State / derivedStateOf ). ومع ذلك ، تتمتع مكتبة Coroutines بميزة أنها متاحة لمزيد من المنصات وهي مستقلة تمامًا عن أي أطر عمل واجهة المستخدم. أخيرًا ، من المحتمل أن تعتمد معظم المكتبات غير المفتوحة من غير المصدر على Coroutines ، لذلك قد يكون الكود المستند إلى StateFlow أفضل أيضًا للتوافق/قابلية التشغيل البيني.
وبعبارة أخرى ، فإن مزيج كلا الحلين المستخدمين معًا ينتج عنه قاعدة كود تفاعلية تام ومتعددة الأناقة - مما يحسن بساطة الكود ويتجنب العديد من الأخطاء.
علاوة على ذلك ، لا يوفر JetPack Compose حاليًا أي دعم multiplatform ViewModel أو أي بنية واسعة النطاق. لذلك ، تحل هذه المكتبة ذلك من خلال توفير BaseReactiveState لـ ViewModels. كما أنه يأتي مع نظام أحداث على دراية بدورة الحياة ( eventNotifier ) ومعالجة حالة التحميل (بحيث يمكنك تتبع مؤشرات تحميل مختلفة أو متعددة استنادًا إلى coroutines التي تطلقها).
تعتمد هذه المكتبة على 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.