การเขียนจะพิจารณาประเภทว่าเสถียรหรือไม่เสถียร ประเภทจะมีค่าคงที่หาก จะเปลี่ยนแปลงไม่ได้ หรือถ้าเป็นไปได้ที่ 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 รายการ:
- Compose จะประเมินว่าควรเขียนโค้ดใหม่ภายใน
ContactRowหรือไม่ - เห็นว่าอาร์กิวเมนต์เดียวสำหรับ
ContactDetailsเป็นประเภทContact - เนื่องจาก
Contactเป็นคลาสข้อมูลที่เปลี่ยนแปลงไม่ได้ Compose จึงกำหนดว่าไม่มี อาร์กิวเมนต์สำหรับContactDetailsเปลี่ยนไป - ดังนั้น Compose จะข้าม
ContactDetailsและไม่เขียนใหม่ - ในทางกลับกัน อาร์กิวเมนต์สำหรับ
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 คลาสโมเดลหากจำเป็น
อ่านเพิ่มเติม
- ประสิทธิภาพ: ดูเคล็ดลับการแก้ไขข้อบกพร่องเพิ่มเติมเกี่ยวกับประสิทธิภาพของ Compose ได้ที่ คู่มือแนวทางปฏิบัติแนะนำและการบรรยายในงาน I/O ของเรา