ธีมใน Jetpack Compose ประกอบด้วยโครงสร้างระดับต่ำกว่าและ API ที่เกี่ยวข้องจำนวนมาก คุณดูข้อมูลเหล่านี้ได้ในซอร์สโค้ดของ MaterialTheme และยังนำไปใช้ในระบบการออกแบบที่กำหนดเองได้ด้วย
คลาสของระบบธีม
โดยทั่วไปธีมจะประกอบด้วยระบบย่อยจำนวนหนึ่งที่จัดกลุ่มแนวคิดด้านภาพและพฤติกรรมที่เหมือนกัน ระบบเหล่านี้สามารถจำลองได้ด้วยคลาสที่มีค่าการกำหนดธีม
เช่น MaterialTheme ประกอบด้วย
ColorScheme
(ระบบสี)
Typography
(ระบบการพิมพ์) และ
Shapes
(ระบบรูปร่าง)
@Immutable data class ColorSystem( val color: Color, val gradient: List<Color> /* ... */ ) @Immutable data class TypographySystem( val fontFamily: FontFamily, val textStyle: TextStyle ) /* ... */ @Immutable data class CustomSystem( val value1: Int, val value2: String /* ... */ ) /* ... */
องค์ประกอบของระบบธีมในเครื่อง
ระบบจะจัดเตรียมคลาสระบบธีมให้กับต้นไม้ Composition โดยนัยเป็นอินสแตนซ์ CompositionLocal ซึ่งจะช่วยให้สามารถอ้างอิงค่าการกำหนดธีมแบบคงที่ในฟังก์ชันที่ประกอบกันได้
ดูข้อมูลเพิ่มเติมเกี่ยวกับ CompositionLocal ได้ที่คู่มือข้อมูลที่กำหนดขอบเขตในเครื่องด้วย CompositionLocal
val LocalColorSystem = staticCompositionLocalOf { ColorSystem( color = Color.Unspecified, gradient = emptyList() ) } val LocalTypographySystem = staticCompositionLocalOf { TypographySystem( fontFamily = FontFamily.Default, textStyle = TextStyle.Default ) } val LocalCustomSystem = staticCompositionLocalOf { CustomSystem( value1 = 0, value2 = "" ) } /* ... */
ฟังก์ชันธีม
ฟังก์ชันธีมคือจุดแรกเข้าและ API หลัก โดยจะสร้างอินสแตนซ์ของระบบธีม CompositionLocal โดยใช้ค่าจริงและตรรกะที่จำเป็น ซึ่งจะส่งไปยังแผนผังองค์ประกอบด้วย CompositionLocalProvider
พารามิเตอร์ content ช่วยให้ Composable ที่ฝังอยู่เข้าถึงค่าการกำหนดธีมที่เกี่ยวข้องกับลำดับชั้นได้
@Composable fun Theme( /* ... */ content: @Composable () -> Unit ) { val colorSystem = ColorSystem( color = Color(0xFF3DDC84), gradient = listOf(Color.White, Color(0xFFD7EFFF)) ) val typographySystem = TypographySystem( fontFamily = FontFamily.Monospace, textStyle = TextStyle(fontSize = 18.sp) ) val customSystem = CustomSystem( value1 = 1000, value2 = "Custom system" ) /* ... */ CompositionLocalProvider( LocalColorSystem provides colorSystem, LocalTypographySystem provides typographySystem, LocalCustomSystem provides customSystem, /* ... */ content = content ) }
ออบเจ็กต์ธีม
การเข้าถึงระบบธีมทำได้โดยใช้ออบเจ็กต์ที่มีพร็อพเพอร์ตี้อำนวยความสะดวก เพื่อความสอดคล้อง ออบเจ็กต์มักจะมีชื่อเหมือนกับฟังก์ชันธีม พร็อพเพอร์ตี้จะรับองค์ประกอบปัจจุบันในเครื่องเท่านั้น
// Use with eg. Theme.colorSystem.color object Theme { val colorSystem: ColorSystem @Composable get() = LocalColorSystem.current val typographySystem: TypographySystem @Composable get() = LocalTypographySystem.current val customSystem: CustomSystem @Composable get() = LocalCustomSystem.current /* ... */ }
แนะนำสำหรับคุณ
- หมายเหตุ: ข้อความลิงก์จะแสดงเมื่อ JavaScript ปิดอยู่
- ข้อมูลที่กำหนดขอบเขตในเครื่องด้วย CompositionLocal
- ระบบการออกแบบที่กำหนดเองใน Compose
- Material Design 3 ใน Compose