ข้อมูลเบื้องต้นเกี่ยวกับขั้นตอน

Home API เวอร์ชัน Kotlin ใช้ flows ซึ่งเป็นฟีเจอร์ของภาษา Kotlin ที่มอบความสามารถอันทรงประสิทธิภาพในการจัดการสตรีมข้อมูลแบบอะซิงโครนัส ซึ่งรวมถึงการเปลี่ยนรูปแบบ การกรอง การแมป การแปลงจากและไปยังคอลเล็กชัน และอื่นๆ

Coroutine เชื่อมโยงกับโฟลว์อย่างใกล้ชิด และให้วิธีการเขียนโค้ดแบบแอซิงโครนัสที่ยอดเยี่ยม ซึ่งช่วยให้นักพัฒนาแอปไม่ต้องเขียนรูทีนการเรียกคืนอย่างชัดเจน ฟิวล์ทำงานร่วมกับโคโริวทีน ซึ่งใช้เป็นวิธีดึงข้อมูลจากโคโริวทีนแบบไม่พร้อมกันโดยไม่ต้องรอให้ฟังก์ชันหรือเธรดทำงานเสร็จ

ผู้บริโภคจะดึงข้อมูลจากโฟลว์ในกระบวนการที่เรียกว่าการเก็บรวบรวม ฟลายท์ Kotlin มีฟังก์ชัน collect() ที่อาจใช้เพื่อวัตถุประสงค์นี้ได้ สิ่งที่เกิดขึ้นในขั้นตอนระหว่างการเก็บรวบรวมจะขึ้นอยู่กับประเภทของขั้นตอน

ขั้นตอน Kotlin (Flow<T>) เป็นแบบเย็นโดยค่าเริ่มต้น ซึ่งหมายความว่าโค้ดเครื่องมือสร้างขั้นตอนจะสร้างข้อมูลก็ต่อเมื่อมีการเรียกใช้ collect() ในทางตรงกันข้าม ฟีดข้อมูลร้อนจะสร้างข้อมูลทันที โดยจัดเก็บข้อมูลไว้ในหน่วยความจําเหมือนคิวสําหรับเวลาที่ระบบใช้ข้อมูล เนื่องจากโฟลว์ที่ใช้งานอยู่จะเก็บข้อมูลไว้ในหน่วยความจํา ระบบจึงถือว่าโฟลว์ดังกล่าวมีสถานะ

คุณอาจแปลงโฟลว์จากแบบเย็นเป็นแบบร้อนได้โดยใช้โอเปอเรเตอร์ shareIn (ดูการเปลี่ยนโฟลว์แบบเย็นเป็นโฟลว์แบบร้อนโดยใช้ shareIn) นอกจากนี้ คุณยังใช้ SharedFlow หรือ StateFlow เพื่อเปลี่ยนโฟลว์แบบเย็นเป็นโฟลว์แบบร้อนได้ด้วย

วิธีที่แอปตัวอย่างใช้โฟลว์

แอปตัวอย่างใช้โมเดลมุมมองใน Jetpack Compose ที่เชื่อมต่อกับขั้นตอนใน Home API องค์ประกอบ UI ของแอปตัวอย่างจำนวนมากจะทำงานตามสถานะ แต่โต้ตอบได้ แอปตัวอย่างยังผสมสถานะจากอุปกรณ์เข้ากับสถานะ "ในแง่ดี" ใน UI เพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานแบบเรียลไทม์ คําว่า "มองโลกในแง่ดี" หมายความว่าแอปจะถือว่าการดําเนินการหนึ่งๆ สําเร็จและอัปเดต UI ให้แสดงผลลัพธ์ที่คาดหวังโดยทันทีโดยไม่ต้องรอการยืนยัน หากพบว่าการดำเนินการไม่สำเร็จ ระบบจะอัปเดต UI ให้แสดงสถานะจริง

ในแอปตัวอย่าง ระบบจะสร้างโฟลว์สําหรับแต่ละเลเยอร์ของโมเดลมุมมอง (โครงสร้าง ห้อง อุปกรณ์) ตัวอย่างเช่น การดำเนินการนี้จะดำเนินการกับโครงสร้างที่มีคำเรียกต่อไปนี้ใน GlobalViewModel.kt

  fun getStructuresState(): StateFlow<List<StructureModel>?> =
    homeClient
      .structures()
      .map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
      .handleErrors()
      .flowOn(Dispatchers.IO)
      .stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)

emitAll() จะรวบรวมค่าทั้งหมดจากโฟลว์ที่ระบุและส่งไปยังตัวรวบรวม stateIn() จะแชร์ค่าที่ส่งออกล่าสุดจากอินสแตนซ์เดียวที่ทํางานอยู่ของโฟลว์ต้นทางกับผู้สมัครใช้บริการปลายทางหลายราย ดูข้อมูลเพิ่มเติมได้ที่ข้อมูลอ้างอิง kotlinx.coroutines.flow

Jetpack Compose

หากต้องการจัดเก็บออบเจ็กต์การไหลในหน่วยความจำในเครื่องและป้องกันไม่ให้สิ้นสุดการทำงาน ให้ใช้ Kotlin remember API

ใน Jetpack Compose หากคุณใช้สิ่งนี้กับ collectAsStateWithLifecycle() ทาง Jetpack จะจัดการการสมัครรับและการยกเลิกการสมัครรับจากโฟลว์โดยอัตโนมัติ โดยอิงตามว่า UI ของแอปพลิเคชันที่แสดงสถานะนั้นอยู่เบื้องหน้าหรือไม่

การเรียกใช้ง่ายๆ ในแอปตัวอย่างจะทําเช่นนี้ การใช้ฟังก์ชัน getStructuresState() ที่แสดงก่อนหน้านี้

val structuresList by
    remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()

ตอนนี้เมื่อสถานะของโครงสร้างมีการเปลี่ยนแปลง (เช่น name) ฟังก์ชัน Composable ที่ใช้โครงสร้างดังกล่าวจะแสดงสถานะที่อัปเดตโดยอัตโนมัติ ในแอปตัวอย่าง ฟังก์ชันนี้คือ HomeActivityContent()

แหล่งข้อมูล

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Kotlin, Flow, Coroutine และ Jetpack Compose ได้ที่แหล่งข้อมูลต่อไปนี้