Lộ trình 10 ngày cho người mới Kotlin Multiplatform
Kotlin+ Compose Multiplatform, MVVM + Koin + State Machine
00.01Android Studio, JDK và KMP pluginFreeTiếp theo→ JDK 17+, Android Studio stable, plugin Kotlin Multiplatform, Xcode nếu bạn dùng macOS, và kdoctor để kiểm tra máy.15 phút
00.02App KMP đầu tiên trên Android và iOSFree→ Tạo một project Compose Multiplatform tối giản, chạy nó trên máy thật, và đọc được ba source set commonMain / androidMain / iosMain.13 phút
00.03Clone TicTac, Git checkpoint và rules file cho AIFree→ Clone repo TicTac, chạy nó trên Android, tạo branch cá nhân, và viết rules file pin đúng stack để AI không gợi ý code Android thuần.16 phút
01.01Null safety, biến và hàm→ val và var, kiểu nullable, các operator ?. ?: !!, tham số mặc định và tham số có tên, lambda, extension function - đọc trên code thật của TicTac.11 phút
01.02Data class, enum và sealed interface→ data class cho giá trị bất biến, enum cho tập lựa chọn cố định, sealed interface cho trạng thái nhiều nhánh, when exhaustive - đọc trên code thật của TicTac.12 phút
01.03Collections, coroutines và StateFlow→ filter, map, count, any/none/all, take; suspend và viewModelScope cho việc mất thời gian; StateFlow cho dữ liệu đổi theo thời gian.12 phút
02.01Composable, layout và Modifier→ Composable Function, ba khối layout Column Row Box, thứ tự Modifier quyết định kết quả, và cách TicTac dựng giao diện dùng chung cho Android lẫn iOS.12 phút
02.02State, recomposition và state hoisting→ Recomposition, remember và khóa của nó, collectAsStateWithLifecycle, và state hoisting đẩy tới tận cùng như TicTac làm.12 phút
02.03Lưới và lựa chọn→ Dựng lưới bàn cờ bằng Column, Row và repeat; dựng hàng chip chọn từ enum.entries; và điều kiện để phải đổi sang lazy layout.12 phút
03.01MVVM và phụ thuộc một chiều→ Ba giới hạn của state trong composable, trách nhiệm của Model, ViewModel, View, và cách chứng minh ranh giới bằng chính cấu trúc package của TicTac.13 phút
03.02Model và UiState gộp một chỗ→ Sealed interface thay cho cờ boolean rời rạc, một UiState duy nhất cho cả app, và property get() suy ra thay vì lưu trùng dữ liệu.11 phút
03.03ViewModel với StateFlow→ Cặp _state / state, init{} nạp dữ liệu một lần, Channel CONFLATED gộp lệnh lưu, và hủy timer khi rời màn hình đang chơi.13 phút
04.01Koin căn bản: single và viewModel→ Vấn đề mà dependency injection giải, hai vòng đời single và viewModel, và vì sao initKoin() phải gọi ngoài composition.11 phút
04.02Dependency injection: get(), bind theo contract và call site→ get() để Koin tự lắp đồ thị, bind theo contract để không ai biết lớp cụ thể, và koinViewModel() ở đúng một chỗ trong cây Compose.11 phút
04.03Vòng đời và test đồ thị→ Thay kho thật bằng MapSettings trong test, resolve từng nút của đồ thị, và assertSame để chứng minh single thật sự dùng chung.12 phút
05.01Điều hướng bằng screen state machine→ enum Screen cộng một when trong AppHost thay cho thư viện điều hướng, và ba điều kiện để biết khi nào mô hình phẳng này không còn đủ.12 phút
05.02Một ViewModel cho năm màn hình→ State dùng chung thay cho tham số truyền qua route, và mặt trái của nó: state của màn này vẫn sống khi bạn đang ở màn kia.12 phút
05.03expect/actual và nút back của hệ thống→ Một khai báo chung, mỗi nền tảng một hiện thực: nối nút back Android vào state machine, và hai bộ expect/actual khác trong repo.12 phút
06.01Lưu dữ liệu bằng key-value→ multiplatform-settings, khóa rời rạc thay vì một blob, đọc có giá trị dự phòng riêng từng khóa, và runCatching bọc API đồng bộ dễ vỡ.17 phút
06.02JSON cho danh sách, và fail-soft→ @Serializable, serializer tự viết cho ImmutableList, giải mã có lọc bản ghi hỏng, cắt về giới hạn, và cache tránh mã hóa lại khi không cần.13 phút
06.03Ráp app: từ điểm khởi động tới màn hình→ App.kt làm điểm vào chung, AppHost làm gốc composable, và hai vỏ nền tảng Android với iOS mỏng nhất có thể.12 phút
06.04Theme thủ công, và đưa app ra máy thật→ Palette làm bảng token, dark mode thủ công cố ý bỏ qua theme hệ thống, màu Unspecified để lỗi to tiếng, và lệnh build cho cả hai nền tảng.13 phút