Jetpack Compose Academy · บทเรียน

เหตุการณ์ครั้งเดียวด้วย Channel

ส่งเหตุการณ์การนำทางและข้อความแจ้งเตือนอย่างปลอดภัย

บทเรียน 4 จาก 413 ขั้นตอน

เหตุการณ์ครั้งเดียวด้วย Channel เป็นบทเรียน Jetpack Compose Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Jetpack Compose Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Jetpack Compose Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถานะไม่ใช่เหตุการณ์

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

ปัญหาการเล่นซ้ำ

หากเก็บข้อความแถบแจ้งเตือนไว้ใน StateFlow การเปลี่ยนแปลงการกำหนดค่าจะอ่านข้อความนั้นอีกครั้ง และข้อความจะแสดงซ้ำโดยไม่คาดคิด

ทำความรู้จัก Channel

Channel คือท่อแบบร้อนที่ส่งค่าแต่ละค่าให้ตัวรับเพียงหนึ่งรายโดยเฉพาะ จากนั้นค่าจะถูกใช้ไปและไม่ถูกเล่นซ้ำ

private val _events = Channel<UiEvent>()

การส่งเทียบกับการปล่อยค่า

คุณส่งข้อมูลเข้า Channel ด้วย send ซึ่งเป็นการเรียกใช้แบบพักการทำงาน เหตุการณ์จะรออยู่ในบัฟเฟอร์จนกว่าจะมีสิ่งที่พร้อมรับ

_events.send(UiEvent.NavigateBack)

เปิดเผยเป็นโฟลว์

แปลง Channel ให้เป็นสตรีมสำหรับ UI ด้วย receiveAsFlow ซึ่งอนุญาตให้ผู้เก็บข้อมูลเพียงหนึ่งรายใช้แต่ละเหตุการณ์

val events = _events.receiveAsFlow()

ใช้ครั้งเดียวแล้วหายไปตลอด

เมื่อผู้เก็บข้อมูลรับเหตุการณ์จาก Channel แล้ว เหตุการณ์นั้นจะหายไป การหมุนหน้าจอในภายหลังจะอ่านซ้ำไม่ได้ จึงไม่มีการเล่นซ้ำโดยไม่ตั้งใจ

จำลองเหตุการณ์เป็นชนิดข้อมูล

กำหนดชนิดข้อมูลแบบปิดผนึกชื่อ UiEvent เพื่อให้การกระทำที่เกิดขึ้นครั้งเดียวทุกอย่าง เช่น การนำทางหรือข้อความ ถูกระบุไว้อย่างชัดเจนและครอบคลุมครบถ้วน

sealed interface UiEvent {
    data class ShowToast(val msg: String) : UiEvent
}

เก็บเหตุการณ์ใน Compose

เก็บโฟลว์เหตุการณ์ภายใน LaunchedEffect เพื่อผูกกับวงจรชีวิตของหน้าจอ และเรียกใช้ตัวจัดการแต่ละเหตุการณ์เพียงครั้งเดียว

LaunchedEffect(Unit) {
    events.collect { handle(it) }
}

เลือกนโยบายบัฟเฟอร์

Channel เริ่มต้นจะพักผู้ส่งไว้หากไม่มีผู้รับ คุณสามารถกำหนดบัฟเฟอร์เพื่อไม่ให้การส่งขัดขวางตรรกะของคุณ

Channel<UiEvent>(Channel.BUFFERED)

SharedFlow เป็นทางเลือก

SharedFlow ที่มี replay เป็นศูนย์ก็ใช้ส่งเหตุการณ์ได้เช่นกัน แต่ Channel รับประกันการส่งถึงผู้รับเพียงครั้งเดียว แม้จะไม่มีผู้เก็บข้อมูลที่กำลังทำงานอยู่

แยกสถานะกับเหตุการณ์ออกจากกัน

รูปแบบที่สะอาดคือใช้ StateFlow หนึ่งรายการสำหรับสถานะหน้าจอ และใช้ Channel หนึ่งรายการสำหรับเหตุการณ์ที่เกิดขึ้นครั้งเดียว ทั้งสองส่วนจะไม่สับสนกันอีก

ตรวจสอบอย่างรวดเร็ว

พิจารณาว่าสิ่งใดเหมาะกับการกระทำที่เกิดขึ้นครั้งเดียว

ทบทวน: เหตุการณ์ที่เกิดขึ้นครั้งเดียว

ยอดเยี่ยมครับ/ค่ะ! Channel ส่งเหตุการณ์ที่เกิดขึ้นครั้งเดียว เช่น การนำทางและข้อความแจ้งเตือน ได้เพียงครั้งเดียว โดยแยกเหตุการณ์เหล่านี้ออกจากสถานะหน้าจอที่เล่นซ้ำได้ 🎯

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “เหตุการณ์ครั้งเดียวด้วย Channel” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เหตุการณ์ครั้งเดียวด้วย Channel” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Jetpack Compose Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Jetpack Compose Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เหตุการณ์ครั้งเดียวด้วย Channel”

ส่งเหตุการณ์การนำทางและข้อความแจ้งเตือนอย่างปลอดภัย คุณปฏิบัติ Jetpack Compose Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Jetpack Compose Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Jetpack Compose Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เหตุการณ์ครั้งเดียวด้วย Channel” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Jetpack Compose Academy นี้ได้ไหม

ได้ บทเรียน Jetpack Compose Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. StateFlow กับ SharedFlow
  2. แมปและรวม Flow
  3. stateIn และ WhileSubscribed
  4. เหตุการณ์ครั้งเดียวด้วย Channel
← กลับไปที่ Jetpack Compose Academy