รูปแบบเทียบกับตัวแก้ไข

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

ต่อไปนี้เป็นการเปรียบเทียบระหว่างสไตล์กับคีย์ตัวปรับแต่ง

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

ข้อจำกัดของคีย์ตัวปรับแต่ง

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

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

ข้อจำกัดของสไตล์

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

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

กรณีที่ควรใช้สไตล์แทนคีย์ตัวปรับแต่ง

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

  • เพื่อให้ได้ความสอดคล้องทั่วทั้งธีม: สไตล์ออกแบบมาให้ "นำไปใช้" กับธีมส่วนกลาง แทนที่จะส่งคีย์ตัวปรับแต่งที่ซ้ำกันไปยังทุกคอมโพเนนต์ คุณสามารถกำหนดสไตล์เดียวในธีมเพื่อสร้างลักษณะที่ปรากฏที่เป็นหนึ่งเดียวทั่วทั้งแอป
  • เมื่อทำภาพเคลื่อนไหวบ่อยๆ: สไตล์จะประเมินในเฟสเลย์เอาต์และการวาด ซึ่งช่วยให้พร็อพเพอร์ตี้ เช่น สีหรือสเกล ทำภาพเคลื่อนไหวได้โดยข้ามเฟสการจัดองค์ประกอบไปเลย ซึ่งจะช่วยลดค่าใช้จ่ายด้านประสิทธิภาพลงอย่างมาก ใช้สไตล์แทนคีย์ตัวปรับแต่งเมื่อทำภาพเคลื่อนไหวพร็อพเพอร์ตี้ภาพ
  • การลบล้างเทียบกับการซ้อน: ใช้สไตล์เมื่อต้องการแทนที่พร็อพเพอร์ตี้เริ่มต้น คีย์ตัวปรับแต่งจะเพิ่มเติม (การเพิ่มเส้นขอบจะซ้อนเส้นขอบที่ 2) ในขณะที่สไตล์ใช้ตรรกะ "การเขียนครั้งสุดท้ายชนะ" ซึ่งทำให้การสลับพื้นหลังหรือระยะห่างภายในง่ายขึ้นโดยไม่ทำให้ภาพรก
  • การปรับแต่งคอมโพเนนต์ Material: หากคอมโพเนนต์ Material มีพารามิเตอร์สไตล์ วิธีที่แนะนำคือการปรับแต่งโดยใช้พารามิเตอร์ดังกล่าว สไตล์เหล่านี้ช่วยให้คุณเข้าถึงและแก้ไขพร็อพเพอร์ตี้ที่เฉพาะเจาะจงภายในโครงสร้างภายในของคอมโพเนนต์ที่ประกอบกันได้ ซึ่งอาจไม่สามารถเข้าถึงได้ในกรณีอื่นๆ