ความเสถียรในการเขียน

การเขียนจะพิจารณาประเภทว่าเสถียรหรือไม่เสถียร ประเภทจะมีค่าคงที่หาก จะเปลี่ยนแปลงไม่ได้ หรือถ้าเป็นไปได้ที่ Compose จะทราบว่าค่าของ ที่เปลี่ยนไประหว่างการจัดองค์ประกอบใหม่ ประเภทจะไม่เสถียรหาก Compose ไม่ทราบว่ามี ค่าได้เปลี่ยนไปในระหว่างการจัดองค์ประกอบใหม่

Compose ใช้ความเสถียรของพารามิเตอร์ของ Composable ในการพิจารณาว่า สามารถข้าม Composable ระหว่างการจัดองค์ประกอบใหม่

  • พารามิเตอร์แบบคงที่: หาก Composable มีพารามิเตอร์แบบคงที่ที่ไม่ได้ มีการเปลี่ยนแปลง การเขียนจะข้ามส่วนนี้ไป
  • พารามิเตอร์ที่ไม่เสถียร: หาก Composable มีพารามิเตอร์ที่ไม่เสถียร Compose จะเขียนใหม่เสมอเมื่อเขียนระดับบนสุดของคอมโพเนนต์ใหม่

หากแอปมีคอมโพเนนต์ที่ไม่เสถียรจำนวนมากซึ่ง Compose เสมอ อาจเป็นไปได้ว่าเกิดปัญหาด้านประสิทธิภาพและปัญหาอื่นๆ

เอกสารนี้แสดงรายละเอียดวิธีเพิ่มความเสถียรของแอปเพื่อปรับปรุง ประสิทธิภาพและประสบการณ์โดยรวมของผู้ใช้

วัตถุที่เปลี่ยนแปลงไม่ได้

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

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

data class Contact(val name: String, val number: String)

Composable ContactRow มีพารามิเตอร์ประเภท Contact

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

พิจารณาว่าจะเกิดอะไรขึ้นเมื่อผู้ใช้คลิกปุ่มเปิด/ปิดและ การเปลี่ยนแปลงสถานะ selected รายการ:

  1. Compose จะประเมินว่าควรเขียนโค้ดใหม่ภายใน ContactRow หรือไม่
  2. เห็นว่าอาร์กิวเมนต์เดียวสำหรับ ContactDetails เป็นประเภท Contact
  3. เนื่องจาก Contact เป็นคลาสข้อมูลที่เปลี่ยนแปลงไม่ได้ Compose จึงกำหนดว่าไม่มี อาร์กิวเมนต์สำหรับ ContactDetails เปลี่ยนไป
  4. ดังนั้น Compose จะข้าม ContactDetails และไม่เขียนใหม่
  5. ในทางกลับกัน อาร์กิวเมนต์สำหรับ ToggleButton เปลี่ยนไป และ Compose จะเขียนคอมโพเนนต์ดังกล่าวใหม่

ออบเจ็กต์ที่ปิดได้

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

data class Contact(var name: String, var number: String)

เนื่องจากพารามิเตอร์แต่ละรายการของ Contact เปลี่ยนเป็น var แล้ว คลาสจึงเปลี่ยนแปลงไม่ได้อีก หากมีการเปลี่ยนแปลงคุณสมบัติ Compose จะไม่รับรู้ นั่นเป็นเพราะ Compose จะใช้เฉพาะการติดตามการเปลี่ยนแปลงของ Compose ออบเจ็กต์สถานะ

การเขียนมองว่าชั้นเรียนมีความไม่เสถียร การเขียนไม่ข้ามการจัดองค์ประกอบใหม่ ชั้นเรียนที่ไม่เสถียร ดังนั้น หากกำหนด Contact ในลักษณะนี้ ContactRow ในตัวอย่างก่อนหน้านี้จะเขียนใหม่ทุกครั้งที่ selected มีการเปลี่ยนแปลง

การใช้งานใน Compose

ซึ่งอาจเป็นประโยชน์หากพิจารณาวิธีการเขียน กำหนดฟังก์ชันที่จะข้ามระหว่างการจัดองค์ประกอบใหม่

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

ฟังก์ชัน

เขียนสามารถทำเครื่องหมายฟังก์ชันเป็น skippable หรือ restartable โปรดทราบว่าอาจ ทำเครื่องหมายฟังก์ชันเป็น 1 ทั้งคู่ หรือไม่เลือกเลยก็ได้

  • ข้ามได้: หากคอมไพเลอร์ทำเครื่องหมาย Composable เป็นข้ามได้ Compose สามารถ ข้ามเมื่อจัดองค์ประกอบใหม่ถ้าอาร์กิวเมนต์ทั้งหมดเท่ากัน ค่าก่อนหน้า
  • รีสตาร์ทได้: Composable ที่รีสตาร์ทได้จะทำหน้าที่เป็น "ขอบเขต" ที่ไหน การจัดองค์ประกอบใหม่สามารถเริ่มต้นขึ้นได้ กล่าวอีกนัยหนึ่ง ฟังก์ชันนี้อาจเป็นจุด รายการสำหรับตำแหน่งที่ Compose สามารถเริ่มเรียกใช้โค้ดอีกครั้งสำหรับการจัดองค์ประกอบใหม่หลังจาก การเปลี่ยนแปลงสถานะ

ประเภท

เขียนประเภทเครื่องหมายที่เปลี่ยนแปลงไม่ได้หรือคงที่ แต่ละประเภทคือ 1 ประเภทหรือ อื่นๆ:

  • เปลี่ยนแปลงไม่ได้: เขียนเครื่องหมายประเภทที่เปลี่ยนแปลงไม่ได้หากค่าของประเภท จะไม่สามารถเปลี่ยนแปลงได้ และเมธอดทั้งหมดมีความโปร่งใสอ้างอิง
    • โปรดทราบว่าประเภทพื้นฐานทั้งหมดจะถูกทําเครื่องหมายว่าเปลี่ยนแปลงไม่ได้ ซึ่งรวมถึง String, Int และ Float
  • เสถียร: ระบุประเภทที่คุณสมบัติเปลี่ยนแปลงได้หลังจากการสร้าง หากและเมื่อพร็อพเพอร์ตี้เหล่านั้นเปลี่ยนแปลงระหว่างรันไทม์ Compose จะรับรู้ การเปลี่ยนแปลงเหล่านั้น

แก้ไขข้อบกพร่องเรื่องความเสถียร

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

สำหรับข้อมูลโดยละเอียดเกี่ยวกับวิธีวินิจฉัยปัญหาที่ซับซ้อนเกี่ยวกับความเสถียรใน เขียน โปรดดูคำแนะนำความเสถียรในการแก้ไขข้อบกพร่อง

แก้ปัญหาความเสถียร

สำหรับข้อมูลเกี่ยวกับวิธีเพิ่มความเสถียรให้กับการใช้งาน Compose โปรดดู ในคู่มือแก้ปัญหาความเสถียร

สรุป

โดยรวมแล้ว คุณควรทราบประเด็นต่อไปนี้

  • พารามิเตอร์: Compose จะกำหนดความเสถียรของพารามิเตอร์แต่ละรายการ Composable เพื่อกำหนด Composable ที่ควรข้ามระหว่าง การจัดองค์ประกอบใหม่
  • การแก้ไขทันที: หากคุณสังเกตเห็นว่าระบบไม่ได้ข้าม Composable และ ทำให้เกิดปัญหาด้านประสิทธิภาพ คุณควรตรวจสอบสาเหตุที่แน่ชัดของ ความไม่เสถียร เช่น พารามิเตอร์ var ก่อน
  • รายงานคอมไพเลอร์: คุณสามารถใช้รายงานคอมไพเลอร์เพื่อ กำหนดความมั่นคงของชั้นเรียน
  • คอลเล็กชัน: การเขียนจะถือว่าคลาสคอลเล็กชันไม่เสถียรเสมอ เช่น ในชื่อ List, Set และ Map เนื่องจากไม่สามารถรับประกันได้ว่า จะเปลี่ยนแปลงไม่ได้ คุณสามารถใช้คอลเล็กชันที่เปลี่ยนแปลงไม่ได้ของ Kotlinx แทน หรือ ใส่คำอธิบายประกอบชั้นเรียนเป็น @Immutable หรือ @Stable
  • โมดูลอื่นๆ: Compose จะพิจารณาตำแหน่งที่ไม่เสถียรเสมอ โมดูลที่คอมไพเลอร์ Compose ไม่ทำงาน รวมชั้นเรียนใน UI คลาสโมเดลหากจำเป็น

อ่านเพิ่มเติม