navigationevent

  
ไลบรารีเหตุการณ์การนำทางมี API ที่ใช้ KMP เป็นอันดับแรกสำหรับการจัดการการย้อนกลับของระบบและท่าทางสัมผัสย้อนกลับแบบคาดเดา
อัปเดตล่าสุด รุ่นที่เสถียร รุ่นที่อาจได้รับการเผยแพร่ รุ่นเบต้า รุ่นอัลฟ่า
13 สิงหาคม 2025 - - - 1.0.0-alpha06

การประกาศทรัพยากร Dependency

หากต้องการเพิ่มทรัพยากร Dependency ใน NavigationEvent คุณต้องเพิ่มที่เก็บ Maven ของ Google ลงใน โปรเจ็กต์ อ่านข้อมูลเพิ่มเติมได้ที่ที่เก็บ Maven ของ Google

เพิ่มการอ้างอิงสำหรับอาร์ติแฟกต์ที่คุณต้องการในไฟล์ build.gradle สำหรับแอปหรือโมดูลของคุณ

Groovy

dependencies {
    implementation "androidx.navigationevent:navigationevent:1.0.0-alpha06"
}

Kotlin

dependencies {
    implementation("androidx.navigationevent:navigationevent:1.0.0-alpha06")
}

ดูข้อมูลเพิ่มเติมเกี่ยวกับการพึ่งพาได้ที่เพิ่มการพึ่งพาบิลด์

ความคิดเห็น

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

สร้างปัญหาใหม่

ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของเครื่องมือติดตามปัญหา

ไม่มีบันทึกประจำรุ่นสำหรับอาร์ติแฟกต์นี้

รุ่น 1.0

เวอร์ชัน 1.0.0-alpha06

13 สิงหาคม 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha06 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha06 มีการเปลี่ยนแปลงเหล่านี้

ฟีเจอร์ใหม่

Passive Listeners API

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

ฟีเจอร์นี้มี 2 ส่วน ได้แก่

  1. การระบุข้อมูล - ใช้ NavigationEventInfo เพื่อส่งข้อมูลที่กำหนดเอง
  2. สถานะการใช้งาน - ใช้ dispatcher.state (NavigationEventState) เพื่อสังเกตความคืบหน้าและบริบทของท่าทางสัมผัส
  • NavigationEventCallback ตอนนี้ได้เปิดเผยเมธอด setInfo(currentInfo, previousInfo) เพื่อตั้งค่าบริบทท่าทางสัมผัสในการเรียกครั้งเดียว (I1d5e7, b/424470518)
  • NavigationEventHandler เพิ่มการโอเวอร์โหลดใหม่ที่ยอมรับ currentInfo และ previousInfo ซึ่งทําให้เป็น API หลักสําหรับการระบุบริบทในแอป Compose (I6ecd3, b/424470518)

ตัวอย่าง

  data class MyScreenInfo(val screenName: String) : NavigationEventInfo

  NavigationEventHandler(
      enabled = true,
      currentInfo = MyScreenInfo("Details Screen"),
      previousInfo = MyScreenInfo("Home Screen")
  ) { /* Handle back completion */ }
  • NavigationEventDispatcher ตอนนี้แสดง dispatcher.state และ dispatcher.getState<T>() (If7fae, Ia90ca, b/424470518) แล้ว API ที่อิงตาม StateFlow เหล่านี้ช่วยให้ UI ใดก็ตามสังเกตความคืบหน้าของท่าทางสัมผัสและข้อมูลตามบริบทได้โดยไม่ต้องจัดการเหตุการณ์โดยตรง

ตัวอย่าง

  val gestureState by LocalNavigationEventDispatcherOwner.current!!
      .navigationEventDispatcher
      .state
      .collectAsState()

  val progress = gestureState.progress // Returns latestEvent.progress or 0F

  when (val state = gestureState) {
      is InProgress -> {
          val toScreen = state.currentInfo as MyScreenInfo
          val fromScreen = state.previousInfo as MyScreenInfo
          println("Navigating from ${fromScreen.screenName} to ${toScreen.screenName}")
      }
      is Idle -> { /* Idle state */ }
  }
  • เพิ่มพร็อพเพอร์ตี้ progress ลงใน NavigationEventState (I7b196) ที่แสดงผล latestEvent.progress เมื่อดำเนินการ หรือ 0F ในกรณีอื่นๆ

    val progress = state.progress
    
  • เพิ่ม NavigationEventDispatcherOwner composable เพื่อสร้าง ลิงก์ และทิ้งอินสแตนซ์ NavigationEventDispatcher ตามลำดับชั้น เปิดใช้การควบคุมแบบไดนามิกของสถานะที่เปิดใช้ของ Dispatcher และการล้างข้อมูลอัตโนมัติ

    @Composable
    fun Sample() {
        NavigationEventDispatcherOwner(enabled = true) {
            val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current
        }
    }
    

การเปลี่ยนแปลง API

  • พารามิเตอร์ isPassthrough ถูกนำออกจาก NavigationEventCallback แล้ว (I99028, b/424470518)
  • ตอนนี้ตัวสร้าง NavigationEventState เป็นแบบภายในแล้ว สำหรับการทดสอบ ให้อัปเดตสถานะ (ค่าเริ่มต้นคือ Idle) ผ่าน DirectNavigationEventInputHandler เรียกใช้ handleOnStarted หรือ handleOnProgressed เพื่อตั้งค่าสถานะเป็น InProgress และ handleOnCompleted หรือ handleOnCancelled เพื่อเปลี่ยนกลับเป็น Idle หากต้องการอัปเดต NavigationEventInfo ให้ใช้ NavigationEventCallback.setInfo (I93dca, b/424470518)
  • เพิ่มพารามิเตอร์เริ่มต้นลงใน NavigationEvent เพื่อให้การเริ่มต้นใช้งานง่ายขึ้นและลดความซับซ้อนของการทดสอบ ซึ่งควรใช้แทน TestNavigationEvent (I5dc49, I232f4)
  • เพิ่ม TestNavigationEventCallback สำหรับทดสอบเหตุการณ์การนำทางที่มีสถานะปัจจุบัน/ก่อนหน้าเฉพาะ (Idd22e, b/424470518)
  • NavigationEventInputHandler ได้รับการเปลี่ยนให้เป็นคลาสแบบนามธรรมเพื่อแทนที่ AbstractNavigationEventInputHandler ก่อนหน้าด้วยการติดตั้งใช้งานใน DirectNavigationEventInputHandler (Iadde5, Ifed40I3897c, b/432616296, b/435416924)
  • ฟังก์ชัน send* ใน NavigationEventInputHandler มีการเปลี่ยนชื่อคำนำหน้าเป็น handle* (Iffcaf)
  • ตอนนี้ OnBackInvokedInputHandler ได้ขยายเวลา abstract NavigationInputHandler ที่เพิ่งเปิดตัว (Ib45aa)
  • เปลี่ยน NavigationEventDispatcherOwner ให้ต้องมี Dispatcher หลักที่คุณต้องส่ง null อย่างชัดเจนเพื่อสร้าง Dispatcher รูท (Ia6f64, b/431534103)

การแก้ไขข้อบกพร่อง

  • เพิ่มประสิทธิภาพด้วยการหลีกเลี่ยงการคัดลอกคอลเล็กชันใน NavigationEventDispatcher.dispose() (I4ab09)
  • แก้ไขปัญหาที่ NavigationEventHandler ไม่ตอบสนองต่อการเปลี่ยนแปลงสถานะที่เปิดใช้อย่างถูกต้อง (Ia5268,I19bec, I5be5c, b/431534103)

ข้อมูลอัปเดตเกี่ยวกับเอกสาร

  • KDocs สำหรับ NavigationEvent ได้รับการขยายความเพื่อชี้แจงบทบาทในฐานะเครื่องมือรวมเหตุการณ์และลักษณะการทำงานของพร็อพเพอร์ตี้รายละเอียดในประเภทการนำทางต่างๆ (ท่าทางสัมผัส การคลิก) (I91e8d)
  • อัปเดตเอกสารประกอบสำหรับ Compose API ของการจัดการการกลับของระบบ (BackHandler, PredictiveBackHandler, NavigationEventHandler) เพื่อเรียกใช้ลักษณะการทำงานโดยเฉพาะเกี่ยวกับลำดับการเรียกกลับ (I7ab94, )

การอัปเดตการขึ้นต่อกัน

  • NavigationEvent ตอนนี้ขึ้นอยู่กับ Compose Runtime 1.9.0-beta03 ซึ่งช่วยให้ชิ้นงาน navigationevent-compose รองรับเป้าหมาย KMP ทั้งหมดได้ (Ia1b87)

เวอร์ชัน 1.0.0-alpha05

30 กรกฎาคม 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha05 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha05 มีการคอมมิตเหล่านี้

การรองรับลำดับชั้นหลัก-ย่อย:

ตอนนี้ NavigationEventDispatcher มีตัวจัดสรรหลักและย่อยได้แล้ว ซึ่งจะสร้างโครงสร้างแบบต้นไม้ตามลำดับชั้น ซึ่งจะช่วยให้เหตุการณ์การนำทางเผยแพร่และจัดการได้อย่างยืดหยุ่นมากขึ้นในคอมโพเนนต์ UI ของ Compose ที่ซับซ้อนโดยการแสดงลําดับชั้นโครงสร้างของ UI ผ่านตัวจัดส่งที่เชื่อมโยงกัน (I194ac)

  // Create a parent dispatcher that will manage navigation events at a higher level.
  val parentDispatcher = NavigationEventDispatcher()

  // Create a child dispatcher linked to the parent, forming a hierarchy.
  val childDispatcher = NavigationEventDispatcher(parentDispatcher)

isEnabledพร็อพเพอร์ตี้แบบลำดับชั้นช่วยให้ควบคุมผู้จัดส่งจากบนลงล่างได้ เมื่อตั้งค่า isEnabled เป็น false ใน Dispatcher ระบบจะปิดใช้ Dispatcher ทั้งหมดที่สืบทอดมาโดยอัตโนมัติ ฟีเจอร์นี้ช่วยให้ปิดทั้งกิ่งก้านของระบบเหตุการณ์การนำทางได้อย่างมีประสิทธิภาพ (I9e985)

  // Disabling the child dispatcher disables all its callbacks and any of its children recursively.
  childDispatcher.isEnabled = false

นอกจากนี้ พร็อพเพอร์ตี้ isEnabled ใน NavigationEventCallback จะพิจารณาสถานะที่เปิดใช้ของเครื่องมือจัดส่งที่เชื่อมโยงแล้ว ซึ่งหมายความว่าระบบจะถือว่ามีการเปิดใช้การเรียกกลับก็ต่อเมื่อมีการเปิดใช้ทั้งการเรียกกลับเองและตัวจัดสรร (รวมถึงบรรพบุรุษ) เพื่อให้มั่นใจว่ามีการควบคุมแบบลำดับชั้นที่สอดคล้องกันในการเปิดใช้งานการเรียกกลับ (I1799a)

  // Create a test callback and add it to the child dispatcher.
  val callback1 = TestNavigationEventCallback(isEnabled = true)
  childDispatcher.addCallback(callback1)

  // Since the childDispatcher is disabled, the callback is effectively disabled as well.
  assertThat(callback1.isEnabled).isFalse()

เราได้เปิดตัวdispose()วิธีใหม่สำหรับการล้างข้อมูลที่เหมาะสมของ Dispatcher และ Dispatcher ย่อย การเรียกใช้ dispose() จะหยุดการทำงานของ Listener เพื่อป้องกันหน่วยความจำรั่ว ยกเลิกการจัดสรร Dispatcher ย่อยทั้งหมดแบบเรียกซ้ำ นำ Callback ทั้งหมดที่ลงทะเบียนไว้กับ Dispatcher ออก และยกเลิกการลิงก์ Dispatcher กับ Dispatcher หลัก ซึ่งจะช่วยให้มั่นใจได้ว่าระบบจะปล่อยทรัพยากรอย่างถูกต้องเมื่อไม่จำเป็นต้องใช้ Dispatcher อีกต่อไป (I9e985)

  // Dispose the child dispatcher to clean up resources.
  childDispatcher.dispose()

หากมีการเรียกใช้เมธอดสาธารณะใน Dispatcher ที่ถูกทิ้ง ระบบจะส่ง IllegalStateException ทันที ซึ่งจะช่วยป้องกันไม่ให้เกิดข้อผิดพลาดแบบเงียบๆ และช่วยให้นักพัฒนาแอปทราบถึงการใช้งานที่ไม่เหมาะสมในระหว่างการพัฒนา (Ic2dc3)

  val callback2 = TestNavigationEventCallback()

  // Attempting to use a disposed dispatcher will throw an exception.
  assertThrows<IllegalStateException> {
      childDispatcher.addCallback(callback2)
  }

หมายเหตุ: เราจะเปิดตัว NavigationEventDispatcherOwner Composable ใหม่ที่จะจัดการ Dispatcher ของ Child ภายใน Compose UI โดยอัตโนมัติใน aosp/3692572 อย่างไรก็ตาม การเปลี่ยนแปลงนี้ไม่ได้รวมอยู่ในการเปิดตัวปัจจุบัน และเรามีแผนที่จะรวมไว้ในการเปิดตัวครั้งถัดไป

คลังการทดสอบการนำทาง

  • เพิ่มnavigationevent-testingโมดูลเพื่อจัดเตรียมยูทิลิตีการทดสอบเฉพาะสำหรับไลบรารี navigationevent (0e50b6)
  • เพิ่มคลาสยูทิลิตีปลอม TestNavigationEventCallback สำหรับการทดสอบ โดยจะบันทึกการเรียกเมธอด Callback และจัดเก็บรายการ NavigationEvent ที่ได้รับเพื่อรองรับการยืนยัน (4a0246)
  • เพิ่มTestNavigationEventฟังก์ชันยูทิลิตีจำลองเพื่อสร้างอินสแตนซ์ NavigationEvent ที่มีค่าเริ่มต้น ซึ่งจะช่วยลดความซับซ้อนของการทดสอบหน่วยสำหรับการประมวลผลเหตุการณ์การนำทาง (3b63f5)
  • เพิ่มคลาสยูทิลิตีปลอม TestNavigationEventDispatcherOwner สำหรับการทดสอบ โดยจะติดตามจำนวนเหตุการณ์สำรองและเหตุการณ์การเปลี่ยนสถานะที่เปิดใช้เพื่อรองรับการยืนยันการโต้ตอบในการทดสอบ (c8753e)

การเปลี่ยนแปลง API

  • ย้าย NavigationEventInputHandler จาก androidMain ไปยัง commonMain เพื่อให้พร้อมใช้งานในโค้ดทั่วไปของ KMP เพิ่มpublic send* วิธีใหม่สำหรับการส่งเหตุการณ์ เปลี่ยนฟังก์ชันการเรียกใช้ใน NavigationEventDispatcher จาก public เป็น internal ตอนนี้ผู้ใช้ต้องใช้ NavigationEventInputHandler เพื่อส่งเหตุการณ์ (Ia7114)
  • เปลี่ยนชื่อ NavigationInputHandler เป็น OnBackInvokedInputHandler (I63405)

การแก้ไขข้อบกพร่อง

  • ทำการรีแฟกเตอร์ NavigationEventDispatcher เพื่อลดโอเวอร์เฮดโดยหลีกเลี่ยงการจัดสรรรายการกลางและปรับปรุงประสิทธิภาพการเรียกกลับ (I82702, I1a9d9)
  • เพิ่มคำอธิบายประกอบ @FloatRange ลงในฟิลด์ touchX, touchY และ progress ใน NavigationEvent เพื่อบังคับใช้ช่วงค่าที่ถูกต้องในเวลาคอมไพล์และปรับปรุงความปลอดภัยของ API (Iac0ec)

เวอร์ชัน 1.0.0-alpha04

2 กรกฎาคม 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha04 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha04 มีการเปลี่ยนแปลงเหล่านี้

การแก้ไขข้อบกพร่อง

  • ใช้ implementedInJetBrainsFork เพื่อnavigationevent-compose และเพิ่มเป้าหมาย commonStubs ให้ตรงกับรูปแบบของ Compose ขอเปลี่ยนแปลงโดย JetBrains (f60c79)
  • แก้ไขการใช้ปลั๊กอินคอมไพเลอร์ Compose สำหรับ Kotlin/Native เพื่อให้มั่นใจว่ามีการสร้าง Stub ที่ถูกต้อง ไม่มีผลต่อ API สาธารณะหรือลักษณะการทำงาน (1890c9)

เวอร์ชัน 1.0.0-alpha03

18 มิถุนายน 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha03 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha03 มีคอมมิตเหล่านี้

ฟีเจอร์ใหม่

  • เปิดตัวnavigationevent-composeโมดูลใหม่เพื่อรองรับฟีเจอร์ Jetpack Compose ในไลบรารี navigationevent (980d78)
  • NavigationEvent Compose ได้เพิ่มLocalNavigationEventDispatcherOwnerการแต่งเพลงในพื้นที่ใหม่ โดยจะแสดงผลค่าที่อนุญาตให้เป็น Null เพื่อให้ระบุได้ดียิ่งขึ้นว่าค่าดังกล่าวพร้อมใช้งานในองค์ประกอบปัจจุบันหรือไม่ ตอนนี้ NavigationEventHandler จะแสดงข้อผิดพลาดหากไม่พบเจ้าของที่เกี่ยวข้อง (62ffda)
  • NavigationEvent Compose ได้เพิ่ม NavigationEventHandler Composable ใหม่เพื่อจัดการเหตุการณ์ (ท่าทางสัมผัสย้อนกลับแบบคาดการณ์) โดยจะแสดง Flow ของออบเจ็กต์ NavigationEvent ที่ต้องรวบรวมใน Lambda ที่ระงับซึ่งคุณระบุ c42ba6 :
NavigationEventHandler { progress: Flow<NavigationEvent> ->
  // This block is executed when the back gesture begins.
  try {
    progress.collect { backEvent ->
      // Handle gesture progress updates here.
    }
    // This block is executed if the gesture completes successfully.
  } catch (e: CancellationException) {
    // This block is executed if the gesture is cancelled
    throw e
  } finally {
    // This block is executed either the gesture is completed or cancelled
  }
}

การเปลี่ยนแปลง API

  • ตอนนี้คุณจะลงทะเบียน NavigationEventCallback แต่ละรายการกับ NavigationEventDispatcher ได้เพียงรายการเดียวในแต่ละครั้ง การเพิ่มลงในผู้จัดส่งหลายรายจะทำให้เกิด IllegalStateException โปรดทราบว่าลักษณะการทำงานนี้แตกต่างจาก OnBackPressedDispatcher ซึ่งอนุญาตให้มีผู้จัดส่งหลายราย (e82c19)
  • ทำให้ isPassThrough เป็น val เพื่อป้องกันการเปลี่ยนแปลงระหว่างการนำทาง ซึ่งอาจทำให้การส่งของ NavigationEvent ทำงานไม่ได้ (I0b287)

เวอร์ชัน 1.0.0-alpha02

4 มิถุนายน 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha02 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha02 มีการคอมมิตเหล่านี้

การเปลี่ยนแปลง API

  • แทนที่ตัวสร้างรองของ NavigationEventDispatcher ด้วยอาร์กิวเมนต์เริ่มต้น (I716a0)
  • นำพร็อพเพอร์ตี้ที่มีลำดับความสำคัญออกจาก NavigationEventCallback ส่งต่อลำดับความสำคัญไปยัง NavigationEventDispatcher.addCallback() แทน (I13cae)

การแก้ไขข้อบกพร่อง

  • แก้ไข ConcurrentModificationException ที่อาจเกิดขึ้นเมื่อมีการเรียกใช้ NavigationEventCallback.remove() เนื่องจากการแก้ไขรายการภายในของรายการที่ปิดได้พร้อมกัน (b/420919815)

เวอร์ชัน 1.0.0-alpha01

20 พฤษภาคม 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha01 ได้รับการเผยแพร่แล้ว เวอร์ชัน 1.0.0-alpha01 มีการเปลี่ยนแปลงเหล่านี้

ฟีเจอร์ใหม่

  • ไลบรารี androidx.navigationevent มี API ที่เน้น KMP เป็นอันดับแรกสำหรับการจัดการการย้อนกลับของระบบและการย้อนกลับแบบคาดการณ์ NavigationEventDispatcher เป็น API ทั่วไปสําหรับการลงทะเบียนอินสแตนซ์ NavigationEventCallback อย่างน้อย 1 รายการเพื่อรับเหตุการณ์ย้อนกลับของระบบ
  • เลเยอร์นี้อยู่ใต้ API ที่เปิดตัวก่อนหน้านี้ใน androidx.activity และมีจุดมุ่งหมายเพื่อเป็นตัวแทนที่ยืดหยุ่นกว่าในการใช้ Activity API ในคอมโพเนนต์ระดับสูงขึ้น หรือใช้ API ของเฟรมเวิร์ก Android OnBackInvokedDispatcher โดยตรง เราได้เขียน API ของ androidx.activity ใหม่โดยใช้ Navigation Event API เป็นส่วนหนึ่งของ Activity 1.12.0-alpha01