This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilehigh PriorityID: android-jetpack-compose

Android Jetpack Compose & Kotlin Flow Standard

Conventions for native Android: State hoisting, rememberSaveable for configuration changes, collectAsStateWithLifecycle(), and CoroutineScope lifecycle scoping.

Prohibited Anti-Pattern: AI uses plain collectAsState() causing background battery drain, or modifies ViewModel mutable state from Composables.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Android Jetpack Compose & Kotlin Flow Standard - Conventions for native Android: State hoisting, rememberSaveable for configuration changes, collectAsStateWithLifecycle(), and CoroutineScope lifecycle scoping.
globs: app/src/main/java/**/*.kt
alwaysApply: false
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/android-jetpack-compose"
---

# Android Jetpack Compose & Kotlin Flow Standard

> **Severity**: HIGH | **Category**: mobile
> **Anti-Pattern Warning**: AI uses plain collectAsState() causing background battery drain, or modifies ViewModel mutable state from Composables.

## System Constraints
You are a native Android engineer using Jetpack Compose and Kotlin Coroutines. Always collect StateFlow in UI using collectAsStateWithLifecycle() to stop collection when the app is in the background. Expose StateFlow as read-only to Composables.

## Strict Guidelines
- Always use collectAsStateWithLifecycle() over plain collectAsState() to preserve device battery.
- Expose StateFlow as StateFlow<T>, keeping MutableStateFlow private in ViewModel.
- Use rememberSaveable for UI states that must survive screen rotations and process death.

## Bad vs Good Implementations
### Lifecycle-Aware State Collection in Compose

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Plain collectAsState does not stop Flow collection when Android Activity moves to the background.
```kotlin
// Anti-pattern: Drains battery in background
@Composable
fun ProfileScreen(viewModel: ProfileViewModel) {
    // Keeps collecting from upstream even when app is minimized!
    val state by viewModel.uiState.collectAsState()
    ProfileContent(state)
}
```

#### Production Standard (Correct)
> **Standard**: Automatically pauses flow collection when the Composable lifecycle is below STARTED.
```kotlin
// Production Standard: collectAsStateWithLifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle

@Composable
fun ProfileScreen(viewModel: ProfileViewModel) {
    val state by viewModel.uiState.collectAsStateWithLifecycle()
    ProfileContent(state)
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Android Jetpack Compose & Kotlin Flow Standard

Android Jetpack Compose & Kotlin Flow Standard defines an industrial-grade behavioral standard for mobile engineering. Conventions for native Android: State hoisting, rememberSaveable for configuration changes, collectAsStateWithLifecycle(), and CoroutineScope lifecycle scoping. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: AI uses plain collectAsState() causing background battery drain, or modifies ViewModel mutable state from Composables. Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftAI uses plain collectAsState() causing background battery drain, or modifies ViewModel mutable state from Composables.High
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Always use collectAsStateWithLifecycle() over plain collectAsState() to preserve device battery.

Always use collectAsStateWithLifecycle() over plain collectAsState() to preserve device battery.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Expose StateFlow as StateFlow<T>, keeping MutableStateFlow private in ViewModel.

Expose StateFlow as StateFlow<T>, keeping MutableStateFlow private in ViewModel.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Use rememberSaveable for UI states that must survive screen rotations and process death.

Use rememberSaveable for UI states that must survive screen rotations and process death.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is Android Jetpack Compose & Kotlin Flow Standard critical for AI coding assistants?

Conventions for native Android: State hoisting, rememberSaveable for configuration changes, collectAsStateWithLifecycle(), and CoroutineScope lifecycle scoping. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (AI uses plain collectAsState() causing background battery drain, or modifies ViewModel mutable state from Composables.) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

Related MOBILE Rules

View all rules →
1 Rule in Stack

Android