Skip to content
Development
Skill

/android-state

Configure ViewModel state emission with StateFlow, SharedFlow, and sealed UiState classes in Android. Use for state modeling and sharing policies; defer generic lifecycle collection, navigation-event plumbing, Hilt injection, test code, and configuration-change recipes to their

From plugin
agent-skills-standard
538200 skills1 MCP
Install
$ npx -y skills add hoangnguyen0403/agent-skills-standard --skill android-state --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/android-state

Context preview

The summary Claude sees to decide when to auto-load this skill.

Configure ViewModel state emission with StateFlow, SharedFlow, and sealed UiState classes in Android. Use for state modeling and sharing policies; defer generic lifecycle collection, navigation-event plumbing, Hilt injection, test code, and configuration-change recipes to their

SKILL.md

android-state.SKILL.md
name: android-state
description: Configure ViewModel state emission with StateFlow, SharedFlow, and sealed UiState classes in Android. Use for state modeling and sharing policies; defer generic lifecycle collection, navigation-event plumbing, Hilt injection, test code, and configuration-change recipes to their specific skills.
metadata:
  triggers:
    files:
    - '**/*ViewModel.kt'
    - '**/*UiState.kt'
    keywords:
    - viewmodel
    - stateflow
    - livedata
    - uistate
    - MutableStateFlow
    - collectAsState
    - viewModelScope
    - UiState

Android State Management

**Priority: P0 (CRITICAL)**

1. Structure ViewModel

  • Expose ONE `StateFlow<UiState>` via `.asStateFlow()`.
  • Use `viewModelScope` for all coroutines.
  • Trigger initial load in `init` block.

See [templates](references/implementation.md) for ViewModel and UiState examples.

2. Define UI State (LCE Pattern)

  • Use sealed interface with Loading, Content, Error variants.
  • Mark data classes `@Immutable`.

See [templates](references/implementation.md) for sealed UiState pattern.

3. Collect State Lifecycle-Safely

  • Use `collectAsStateWithLifecycle()` in Compose.
  • Use `SharingStarted.WhileSubscribed(5000)` for shared resources.

Anti-Patterns

  • **No LiveData for New Code**: Use StateFlow — lifecycle-safe and Compose-compatible.
  • **No Public MutableStateFlow**: Expose only `.asStateFlow()` to consumers.
  • **No Context in ViewModel**: Leaks Activity. Use Application context if truly needed.

Verification

  • [ ] Each ViewModel exposes exactly one `StateFlow<UiState>`.
  • [ ] UiState is a sealed interface with Loading, Content, Error variants.
  • [ ] UI collects with `collectAsStateWithLifecycle()`.
  • [ ] `./gradlew test` passes for ViewModel tests.

References

  • [Templates](references/implementation.md)
Read more
Ships withagent-skills-standard

The portable SDLC standards layer for AI coding agents. Sync once, then work in your own runtime.

Get the whole plugin

Other skills on agent-skills-standard.