Part of PatternKit, a side-by-side reference codebase where the same small Tasks CRUD app is implemented once per architecture pattern across iOS and Android. Every module ships identical behaviour — the same domain model, the same three screens, the same mock data layer — so the only thing that varies is the architecture itself.
This module is the plain MVVM flavour on Jetpack Compose: ViewModels expose UI state, Composables render it, and there is no domain/use-case layer — ViewModels talk to the repository directly. It's the natural starting point for a modern Compose app and the baseline that the Clean and MVI modules build on.
- Language: Kotlin
- UI: Jetpack Compose + Material 3
- Architecture: MVVM (no domain layer)
- DI: Dagger 2 (KSP) — plain Dagger, no Hilt
- Navigation: Navigation Compose
- Min SDK: 28 · Target/Compile SDK: 36
- Package:
com.preetanshumishra.patternkit.android.mvvmcompose
A single-user task list. One entity (TaskItem: title, optional notes, optional due date, priority, completion). Three screens:
- List — filter chips (All / Active / Completed), sort by due date or priority, swipe-to-delete, FAB to create.
- Detail — read-only fields, toggle completion, edit, delete.
- Form — create or edit (mode-driven), title validation (≤ 80 chars), due-date validation (not in the past), 600 ms mock async save.
Data comes from MockTaskRepository — an in-memory store seeded with ~12 tasks, with configurable artificial latency and failure rate for exercising loading and error states. No real network, no local persistence — intentionally, so the architecture stays the focus.
Plain Dagger 2, wired by hand:
AppComponent(@Singleton) exposes the repository;RepositoryModule@BindsTaskRepository→MockTaskRepository.PatternKitAppcreates the component and holds it.- A hand-rolled
ViewModelFactorypulls the repository out of the graph and constructs each ViewModel (ViewModels need lifecycle-aware construction + runtime args, so they aren't@Inject-built directly).
app/src/main/kotlin/.../mvvmcompose/
├── data/ # MockTaskRepository, TaskRepository, seed data
├── model/ # TaskItem, Priority, TaskFilter, TaskSort
├── di/ # AppComponent, RepositoryModule
├── ui/
│ ├── list/ # TaskListScreen + TaskListViewModel
│ ├── detail/ # TaskDetailScreen
│ ├── form/ # TaskFormScreen + TaskFormViewModel
│ ├── nav/ # NavHost + Routes
│ ├── theme/ # Material 3 theme
│ └── ViewModelFactory.kt
└── PatternKitApp.kt
./gradlew assembleDebug # build the debug APK
./gradlew installDebug # install on a connected device/emulator
./gradlew test # unit testsOr open the project in Android Studio and run the app configuration.