การจัดการสถานะปฏิกิริยาที่ง่ายและ ViewModels สำหรับ Kotlin Multiplatform ไม่มีแผ่นต้ม เข้ากันได้กับ Android
rectivestate-kotlin จัดเตรียมฐานรากเหล่านี้สำหรับการสร้าง multiplatform viewmodels และตรรกะระดับล่าง:
CoroutineDispatcher s ทุกที่ดูเอกสารประกอบซ้ำสำหรับรายละเอียดเพิ่มเติม
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
} นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณได้รวม repo กลาง maven เช่นในรูท build.gradle :
subprojects {
repositories {
// ...
mavenCentral()
// ...
}
}สองหลักการต่อไปนี้อยู่ที่นี่เพื่อให้คุณมีความคิดอย่างรวดเร็วเกี่ยวกับแง่มุมการเขียนโปรแกรมปฏิกิริยาเท่านั้น ส่วน "คู่มือ" ในเอกสารอธิบายวิธีการทำงานกับแง่มุมขั้นสูงเช่น ViewModels Multiplatform การจัดการวงจรชีวิต ฯลฯ
หมายเหตุ: ในขณะที่การสนทนาเกี่ยวกับ StateFlow คุณยังสามารถใช้ LiveData หรือใช้ส่วนขยายสำหรับค่าที่สังเกตได้อื่น ๆ
ลองนึกภาพคุณมีแบบฟอร์มอินพุตที่มีชื่อแรกและนามสกุลและต้องการสังเกตค่า StateFlow สองตัวในเวลาเดียวกัน:
isFirstNameValid: StateFlow<Boolean>isLastNameValid: StateFlow<Boolean> นี่คือวิธีที่คุณทำโดยใช้ฟังก์ชัน autoRun :
autoRun {
submitButton.isEnabled = get(isFirstNameValid) && get(isLastNameValid)
} ด้วย get(isFirstNameValid) คุณจะดึง isFirstNameValid.value และในเวลาเดียวกันบอกให้ autoRun อีกครั้งจะทำการ execute บล็อกเมื่อใดก็ตามที่มีการเปลี่ยนแปลงค่า รหัสนั้นคล้ายกับการเขียนสิ่งนี้:
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 ปฏิกิริยาหลายชั้น
เฟรมเวิร์ก UI ที่ตอบโต้เช่น Jetpack เขียนขึ้นใหม่โดยอัตโนมัติจะสร้าง UI โดยอัตโนมัติเมื่อใดก็ตามเช่นการเปลี่ยนแปลง StateFlow ดังนั้นในชั้น UI autoRun มักจะถูกแทนที่ด้วย Composable
อย่างไรก็ตามด้านล่าง UI ข้อมูลของคุณยังคงต้องมีปฏิกิริยาเช่นกัน ที่นี่ retivestate ให้ derived เพื่อคำนวณ StateFlow โดยอัตโนมัติตาม StateFlow อื่น ๆ รูปแบบนี้มีประโยชน์มากในการปฏิบัติและเป็นรากฐานที่สมบูรณ์แบบสำหรับเฟรมเวิร์กเช่น Jetpack Compose ซึ่งมุ่งเน้นไปที่ด้าน UI เป็นหลัก Rectivestate ที่ derived และ autoRun ให้ปฏิกิริยาเดียวกันกับข้อมูลและตรรกะทางธุรกิจของคุณ
ใน Jetpack Compose คุณยังได้ derivedStateOf ซึ่งคล้ายกับ derived มาก ดังนั้นคุณสามารถเลือกได้ว่าคุณต้องการสร้างตรรกะทางธุรกิจของคุณตามห้องสมุด Coroutines อย่างเป็นทางการ ( StateFlow / derived ) หรือ Jetpack Compose ( State / derivedStateOf ) อย่างไรก็ตามห้องสมุด Coroutines มีข้อได้เปรียบที่มีให้สำหรับแพลตฟอร์มเพิ่มเติมและเป็นอิสระอย่างเต็มที่จากกรอบ UI ใด ๆ ในที่สุดไลบรารีที่ไม่ใช่แหล่งโอเพ่นซอร์สส่วนใหญ่อาจจะขึ้นอยู่กับ coroutines ดังนั้นรหัสที่ใช้สถานะ StateFlow อาจจะดีกว่าสำหรับความเข้ากันได้/การทำงานร่วมกัน
กล่าวอีกนัยหนึ่งการรวมกันของโซลูชันทั้งสองที่ใช้ร่วมกันส่งผลให้ codebase ที่มีปฏิกิริยาต่อเนื่องกันอย่างสมบูรณ์ซึ่งช่วยปรับปรุงความเรียบง่ายของรหัสและหลีกเลี่ยงข้อบกพร่องมากมาย
นอกจากนี้ Jetpack ในปัจจุบันไม่ได้ให้การสนับสนุน ViewModel แบบทวีคูณหรือสถาปัตยกรรมขนาดใหญ่ใด ๆ ดังนั้นห้องสมุดนี้จึงสามารถแก้ไขได้โดยการจัดหา BaseReactiveState สำหรับ ViewModels นอกจากนี้ยังมาพร้อมกับระบบเหตุการณ์ที่ทราบถึงวงจรชีวิต ( eventNotifier ) และการโหลดการจัดการสถานะ (เพื่อให้คุณสามารถติดตามตัวบ่งชี้การโหลดที่แตกต่างกันหนึ่งหรือหลายตัวตาม coroutines ที่คุณเปิดตัว)
ไลบรารีนี้ขึ้นอยู่กับ Reactive_state สำหรับ Flutter และปรับให้เข้ากับรูปแบบ 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.