
Android Kotlin Development
Scaffold Jetpack Compose screens with navigation, Hilt ViewModels, and list/detail patterns while shipping an Android app.
Overview
Android Kotlin Development is an agent skill for the Build phase that provides Jetpack Compose navigation, ViewModel, and list UI templates for Android apps.
Install
npx skills add https://github.com/aj-geddes/useful-ai-prompts --skill android-kotlin-developmentWhat is this skill?
- NavHost with typed routes and argument-backed details screens
- Hilt-injected ViewModels with collectAsState loading and data lists
- Scaffold, TopAppBar, LazyColumn, and Card-based item rows
- LaunchedEffect-driven fetch-on-enter screen lifecycle pattern
Adoption & trust: 1.1k installs on skills.sh; 250 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need a working Compose navigation and list screen pattern but do not want to waste agent turns guessing Hilt, NavController, and state collection wiring.
Who is it for?
Indie developers or small teams starting or extending a Kotlin Android app with Compose, Navigation, and Hilt.
Skip if: Teams on legacy XML Views-only codebases, iOS-only products, or builders who only need Play Store launch checklists without UI code.
When should I use this skill?
You are implementing or refactoring Jetpack Compose screens, navigation, or ViewModel-driven lists on Android.
What do I get? / Deliverables
You get copy-ready composables for NavHost flows, scaffolded lists, and detail routing so you can focus on domain models and API hooks.
- Composable screen and navigation graph patterns
- List and detail UI scaffolding with loading states
Recommended Skills
Journey fit
Android UI and app structure are built in the product-construction phase before ship-ready mobile releases. Compose layouts, NavHost routing, and screen-level state belong on the mobile frontend shelf alongside other client UI work.
How it compares
Compose UI snippets for agents—not a full Android project generator or MCP device farm.
Common Questions / FAQ
Who is android-kotlin-development for?
Solo and indie builders using AI coding agents to implement Jetpack Compose screens, navigation, and ViewModel-backed lists on Android.
When should I use android-kotlin-development?
During Build when scaffolding new screens, wiring NavHost destinations, or standardizing Hilt ViewModels and loading states before ship testing.
Is android-kotlin-development safe to install?
It is prompt-and-pattern content without built-in shell or network calls; review the Security Audits panel on this page before trusting any third-party skill source.
SKILL.md
READMESKILL.md - Android Kotlin Development
# Jetpack Compose UI ## Jetpack Compose UI ```kotlin @Composable fun MainScreen() { val navController = rememberNavController() NavHost(navController = navController, startDestination = "home") { composable("home") { HomeScreen(navController) } composable("profile") { ProfileScreen(navController) } composable("details/{itemId}") { backStackEntry -> val itemId = backStackEntry.arguments?.getString("itemId") ?: return@composable DetailsScreen(itemId = itemId, navController = navController) } } } @Composable fun HomeScreen(navController: NavController) { val viewModel: ItemsViewModel = hiltViewModel() val items by viewModel.items.collectAsState() val isLoading by viewModel.isLoading.collectAsState() LaunchedEffect(Unit) { viewModel.fetchItems() } Scaffold( topBar = { TopAppBar(title = { Text("Items") }) } ) { paddingValues -> if (isLoading) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { CircularProgressIndicator() } } else { LazyColumn( modifier = Modifier .padding(paddingValues) .fillMaxSize(), contentPadding = PaddingValues(8.dp) ) { items(items) { item -> ItemCard( item = item, onClick = { navController.navigate("details/${item.id}") } ) } } } } } @Composable fun ItemCard(item: Item, onClick: () -> Unit) { Card( modifier = Modifier .fillMaxWidth() .padding(8.dp) .clickable { onClick() } ) { Row(modifier = Modifier.padding(16.dp)) { Column(modifier = Modifier.weight(1f)) { Text(text = item.title, style = MaterialTheme.typography.headlineSmall) Text(text = item.description, style = MaterialTheme.typography.bodyMedium) Text(text = "$${item.price}", style = MaterialTheme.typography.bodySmall) } Icon(imageVector = Icons.Default.ArrowForward, contentDescription = null) } } } @Composable fun ProfileScreen(navController: NavController) { val viewModel: UserViewModel = hiltViewModel() val user by viewModel.user.collectAsState() val isLoading by viewModel.isLoading.collectAsState() LaunchedEffect(Unit) { viewModel.fetchUser("current-user") } Scaffold( topBar = { TopAppBar(title = { Text("Profile") }) } ) { paddingValues -> if (isLoading) { Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { CircularProgressIndicator() } } else if (user != null) { Column( modifier = Modifier .padding(paddingValues) .fillMaxSize() .padding(16.dp) ) { Text(text = user!!.name, style = MaterialTheme.typography.headlineMedium) Text(text = user!!.email, style = MaterialTheme.typography.bodyMedium) Spacer(modifier = Modifier.height(24.dp)) Button( onClick = { viewModel.logout() }, modifier = Modifier.fillMaxWidth() ) { Text("Logout") } } } } } @Composable fun DetailsScreen(itemId: String, navController: NavController) { Scaffold( topBar = { TopAppBar( title = { Text("Details") }, navigationIcon = { IconButton(onClick = { navController.popBackStack() }) { Icon(Icons.Default.ArrowBack, contentDescription = "Back") } } ) } ) { paddingValues -> Column( modifier = Modifier .padding(paddingValues) .fillMaxSize() .padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text("Item ID: $itemId", style = MaterialTheme.typography.headlineSmall) } } } ``` # Models & API Service ## Models & API Service ```kotlin // Models data class User( val id: String, val name: String, val email: String, val avatarUrl: String? = null ) data class