Giới thiệu Compose
1. Jetpack Compose là gì?
Phần tiêu đề “1. Jetpack Compose là gì?”Jetpack Compose là bộ toolkit UI hiện đại của Android, sử dụng Kotlin để xây dựng giao diện theo phong cách declarative.
2. So sánh với XML Views
Phần tiêu đề “2. So sánh với XML Views”| Aspect | XML Views | Jetpack Compose |
|---|---|---|
| Cách viết | Imperative | Declarative |
| Ngôn ngữ | XML + Kotlin/Java | Pure Kotlin |
| State management | Manual | Automatic |
| Preview | Layout Editor | @Preview |
| Reusability | Custom Views phức tạp | Functions đơn giản |
3. Lợi ích của Compose
Phần tiêu đề “3. Lợi ích của Compose”- Ít code hơn: Viết ít hơn 50% so với XML
- Declarative: Mô tả UI thay vì thao tác trực tiếp
- Kotlin-first: Tận dụng sức mạnh của Kotlin
- Reactive: UI tự động cập nhật khi state thay đổi
- Tooling: Live preview, interactive preview
- Interoperability: Tương thích với Views hiện có
4. Setup Compose
Phần tiêu đề “4. Setup Compose”build.gradle.kts (Module: app)
Phần tiêu đề “build.gradle.kts (Module: app)”plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose)}
android { buildFeatures { compose = true }}
dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.androidx.ui) implementation(libs.androidx.material3) implementation(libs.androidx.activity.compose) implementation(libs.androidx.ui.tooling.preview) debugImplementation(libs.androidx.ui.tooling)}5. Composable Function đầu tiên
Phần tiêu đề “5. Composable Function đầu tiên”import androidx.compose.material3.Textimport androidx.compose.runtime.Composable
@Composablefun Greeting(name: String) { Text(text = "Hello, $name!")}Đặc điểm:
Phần tiêu đề “Đặc điểm:”- Đánh dấu với
@Composable - Function name viết PascalCase
- Không return gì (emit UI)
6. MainActivity với Compose
Phần tiêu đề “6. MainActivity với Compose”class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { Greeting("Android") } } } }}7. Preview
Phần tiêu đề “7. Preview”@Preview(showBackground = true)@Composablefun GreetingPreview() { Greeting("Preview")}
// Multiple previews@Preview(name = "Light", showBackground = true)@Preview(name = "Dark", uiMode = UI_MODE_NIGHT_YES)@Composablefun Previews() { MaterialTheme { Greeting("Multi Preview") }}8. Modifier
Phần tiêu đề “8. Modifier”Modifier thay đổi appearance và behavior:
@Composablefun ModifiedText() { Text( text = "Hello Compose", modifier = Modifier .fillMaxWidth() .padding(16.dp) .background(Color.LightGray) .clickable { /* handle click */ } )}9. Composition over Inheritance
Phần tiêu đề “9. Composition over Inheritance”// ❌ XML: Kế thừa CustomView// class MyButton : AppCompatButton
// ✅ Compose: Composition@Composablefun PrimaryButton( text: String, onClick: () -> Unit, modifier: Modifier = Modifier) { Button( onClick = onClick, modifier = modifier, colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary ) ) { Text(text) }}10. Recomposition
Phần tiêu đề “10. Recomposition”Khi state thay đổi, Compose chỉ recompose những phần bị ảnh hưởng:
@Composablefun Counter() { var count by remember { mutableStateOf(0) }
Column { Text("Count: $count") // Recompose khi count thay đổi Button(onClick = { count++ }) { Text("Increment") // Không recompose } }}11. Thinking in Compose
Phần tiêu đề “11. Thinking in Compose”Từ Imperative:
Phần tiêu đề “Từ Imperative:”// XML ViewstextView.text = "Hello"button.setOnClickListener { textView.text = "Clicked"}Sang Declarative:
Phần tiêu đề “Sang Declarative:”// Compose@Composablefun MyScreen() { var text by remember { mutableStateOf("Hello") }
Column { Text(text) Button(onClick = { text = "Clicked" }) { Text("Click me") } }}📝 Tóm tắt
Phần tiêu đề “📝 Tóm tắt”- Jetpack Compose là toolkit UI declarative
@Composablefunctions emit UI- Modifier thay đổi appearance/behavior
- State drives UI (Unidirectional Data Flow)
- Recomposition tự động khi state thay đổi
- Pure Kotlin, không cần XML