สไตล์แตกต่างจากคีย์ตัวปรับแต่งโดยการออกแบบ สไตล์ไม่ได้มาแทนที่คีย์ตัวปรับแต่ง แต่ระบบทั้ง 2 อย่างจะทำงานร่วมกันโดยมีเป้าหมายที่แตกต่างกัน ภายในระบบ สไตล์คือคีย์ตัวปรับแต่ง คุณสามารถทำทุกอย่างที่สไตล์ทำได้ด้วยคีย์ตัวปรับแต่ง แต่ฟังก์ชันการทำงานบางอย่างในคีย์ตัวปรับแต่งจะใช้ไม่ได้ในสไตล์
ต่อไปนี้เป็นการเปรียบเทียบระหว่างสไตล์กับคีย์ตัวปรับแต่ง
| ฟีเจอร์ | คีย์ตัวปรับแต่ง | สไตล์ |
|---|---|---|
| เป้าหมายหลัก | กำหนดลักษณะการทำงาน ความหมาย และเลย์เอาต์ที่ซับซ้อน คีย์ตัวปรับแต่งจะจัดการองค์ประกอบแต่ละรายการแบบเรียลไทม์สำหรับคอมโพเนนต์ที่ประกอบกันได้ที่เฉพาะเจาะจง และจะไม่ส่งต่อจากธีม | กำหนดลักษณะที่ปรากฏ ขนาดของแต่ละรายการ และพร็อพเพอร์ตี้ที่ใช้ธีมได้ สไตล์จะทำงานในระดับธีมและสามารถเขียนทับได้ในระดับคอมโพเนนต์ โดยจะส่งต่อและใช้การจัดรูปแบบกับคอมโพเนนต์ที่ประกอบกันได้ต่างๆ |
| ตรรกะ | เพิ่มเติม - คีย์ตัวปรับแต่งจะรวมกันเพื่อสร้างผลลัพธ์ใหม่ | เขียนทับได้ - ชุดพร็อพเพอร์ตี้สุดท้ายที่ตั้งค่าในสไตล์จะเป็นชุดที่ใช้ สไตล์ทำหน้าที่เป็นพร็อพเพอร์ตี้ชั้นเดียวที่เขียนทับกันตามลำดับความสำคัญที่กำหนดไว้ |
| การใช้ธีม | นำไปใช้กับธีมได้ยาก โดยปกติจะใช้แยกกัน | สไตล์ออกแบบมาให้ใช้ธีมได้ (เข้าถึง CompositionLocals ได้) และกำหนดได้ครั้งเดียวและใช้กับคอมโพเนนต์ต่างๆ ได้ |
| ประสิทธิภาพ | การอัปเดตมักต้องใช้ Compose ทั้ง 3 เฟส ได้แก่ การจัดองค์ประกอบ เลย์เอาต์ และการวาด การทำให้ภาพเคลื่อนไหวของคีย์ตัวปรับแต่งมีประสิทธิภาพดีมักต้องเขียนเวอร์ชันที่อิงตาม Lambda | ข้ามเฟสการจัดองค์ประกอบ โดยจะทำงานเฉพาะในเฟสเลย์เอาต์และการวาด ซึ่งช่วยลดการจัดองค์ประกอบใหม่ ต้องจัดสรรออบเจ็กต์น้อยลง |
| ภาพเคลื่อนไหว | ต้องใช้ Primitive ภาพเคลื่อนไหวแยกต่างหาก เช่น animate*AsState |
มี API animate { } ในตัวที่จัดการภาพเคลื่อนไหวบางรายการให้คุณ |
ข้อจำกัดของคีย์ตัวปรับแต่ง
ตัวปรับแต่งมีประโยชน์มากมายใน Compose ปัจจุบัน อย่างไรก็ตาม สไตล์ช่วยแก้ปัญหาข้อจำกัดบางอย่างของคีย์ตัวปรับแต่ง ซึ่งอธิบายไว้ในรายการต่อไปนี้
- โดยปกติแล้วระบบจะสร้างคีย์ตัวปรับแต่งในเฟสการจัดองค์ประกอบ การอัปเดตอาจบังคับให้มีการเรียกใช้การจัดองค์ประกอบ เลย์เอาต์ และการวาดซ้ำทั้งหมด แม้ว่าจะเป็นการเปลี่ยนแปลงภาพเล็กๆ น้อยๆ เช่น สี เว้นแต่คุณจะสร้างคีย์ตัวปรับแต่งที่อิงตาม Lambda
- คีย์ตัวปรับแต่งตามเงื่อนไขต้องใช้ตรรกะ if-else ที่ขัดขวางภายในเชนที่ราบรื่น การทำภาพเคลื่อนไหวต้องใช้โค้ดเริ่มต้นของสถานะด้วยตนเองและไม่มีกลไก "ทำภาพเคลื่อนไหวอัตโนมัติ" ประสิทธิภาพสูง
- คีย์ตัวปรับแต่งจะซ้อนกันแทนที่จะแทนที่ คุณไม่สามารถลบล้างเส้นขอบเริ่มต้นของคอมโพเนนต์ได้ ทำได้เพียงวาดเส้นขอบที่ 2 ไว้ด้านบน
- คีย์ตัวปรับแต่งนำไปใช้กับธีมส่วนกลางได้ยาก ดังนั้น ธีมจึงมักจะจัดเก็บค่าดิบแทนการกำหนดค่าคีย์ตัวปรับแต่งที่นำกลับมาใช้ซ้ำได้
ข้อจำกัดของสไตล์
แม้ว่าสไตล์จะช่วยเติมเต็มช่องว่างบางอย่างที่คีย์ตัวปรับแต่งมี แต่ก็มีข้อจำกัดบางอย่างที่แสดงให้เห็นว่าสไตล์ไม่สามารถแทนที่คีย์ตัวปรับแต่งได้อย่างสมบูรณ์
- สไตล์เป็นคีย์ตัวปรับแต่งเฉพาะทาง แม้ว่าคีย์ตัวปรับแต่งจะทำทุกอย่างที่สไตล์ทำได้ แต่สไตล์ไม่สามารถทำทุกอย่างที่คีย์ตัวปรับแต่งทำได้ ดังนั้น สไตล์จึงสามารถเสริมคีย์ตัวปรับแต่งได้ แต่ไม่สามารถแทนที่ได้
- สไตล์จำกัดอยู่เพียงการกำหนดค่าภาพ (พื้นหลัง ระยะห่างภายใน เส้นขอบ) ไม่สามารถจัดการลักษณะการทำงาน เช่น ตรรกะการคลิก การตรวจจับท่าทางสัมผัส หรือความหมายด้านการช่วยเหลือพิเศษ
- การแปลงสไตล์เป็นสถานะสุดท้าย ใช้ทรัพยากรมากกว่าการใช้คีย์ตัวปรับแต่งเพียงรายการเดียว ระบบต้องสร้างโครงสร้างข้อมูลที่มีค่าพร็อพเพอร์ตี้ที่เป็นไปได้ทั้งหมด และการค้นหาพร็อพเพอร์ตี้ที่รับช่วงต่อมาจะทำให้กระบวนการนี้ซับซ้อนยิ่งขึ้น
กรณีที่ควรใช้สไตล์แทนคีย์ตัวปรับแต่ง
แม้ว่าการเลือกใช้สไตล์จะขึ้นอยู่กับแอปและกรณีการใช้งานของคุณเป็นส่วนใหญ่ แต่คำแนะนำต่อไปนี้จะช่วยกำหนดได้ว่าควรใช้สไตล์แทนคีย์ตัวปรับแต่งเมื่อใด
- เพื่อให้ได้ความสอดคล้องทั่วทั้งธีม: สไตล์ออกแบบมาให้ "นำไปใช้" กับธีมส่วนกลาง แทนที่จะส่งคีย์ตัวปรับแต่งที่ซ้ำกันไปยังทุกคอมโพเนนต์ คุณสามารถกำหนดสไตล์เดียวในธีมเพื่อสร้างลักษณะที่ปรากฏที่เป็นหนึ่งเดียวทั่วทั้งแอป
- เมื่อทำภาพเคลื่อนไหวบ่อยๆ: สไตล์จะประเมินในเฟสเลย์เอาต์และการวาด ซึ่งช่วยให้พร็อพเพอร์ตี้ เช่น สีหรือสเกล ทำภาพเคลื่อนไหวได้โดยข้ามเฟสการจัดองค์ประกอบไปเลย ซึ่งจะช่วยลดค่าใช้จ่ายด้านประสิทธิภาพลงอย่างมาก ใช้สไตล์แทนคีย์ตัวปรับแต่งเมื่อทำภาพเคลื่อนไหวพร็อพเพอร์ตี้ภาพ
- การลบล้างเทียบกับการซ้อน: ใช้สไตล์เมื่อต้องการแทนที่พร็อพเพอร์ตี้เริ่มต้น คีย์ตัวปรับแต่งจะเพิ่มเติม (การเพิ่มเส้นขอบจะซ้อนเส้นขอบที่ 2) ในขณะที่สไตล์ใช้ตรรกะ "การเขียนครั้งสุดท้ายชนะ" ซึ่งทำให้การสลับพื้นหลังหรือระยะห่างภายในง่ายขึ้นโดยไม่ทำให้ภาพรก
- การปรับแต่งคอมโพเนนต์ Material: หากคอมโพเนนต์ Material มีพารามิเตอร์สไตล์ วิธีที่แนะนำคือการปรับแต่งโดยใช้พารามิเตอร์ดังกล่าว สไตล์เหล่านี้ช่วยให้คุณเข้าถึงและแก้ไขพร็อพเพอร์ตี้ที่เฉพาะเจาะจงภายในโครงสร้างภายในของคอมโพเนนต์ที่ประกอบกันได้ ซึ่งอาจไม่สามารถเข้าถึงได้ในกรณีอื่นๆ