Building Flutter Apps (3/5) — Building Quiet: Riverpod State Management and Play Store

콰이어트(텍스트 북리더) 개발기 — Riverpod 상태 관리와 Play Store 등록

From Flutter development to Play Store submission — building a focused text reader app


Key Takeaways

  • Built a text reader app "Quiet" using Flutter + Riverpod + Hive
  • Used Claude Code pair programming to accelerate development while applying harness structure to app development
  • Learned the importance of Play Store review criteria and metadata preparation

Background

Existing text reader apps were unsatisfying. Plenty of features, but few focused on the core experience of reading text comfortably. Background, font, line spacing, page turning — I wanted a clean app that provides only the minimal settings needed for focused reading.

Simultaneously, I wanted to gain Flutter development experience through to Play Store publication. Quiet serves both goals.


Main Content

2. UX 설계 —

1. Tech Stack Selection

Flutter: Cross-platform capable with free-form UI customization. Since a text viewer is primarily about UI, Flutter's widget system was ideal.

Riverpod: State management library succeeding Provider, with improved type safety and testability. The text viewer has significant state to manage — current page, font settings, brightness, bookmarks — requiring systematic state management.

Hive: Local storage for user settings, reading progress, and bookmarks. Simpler setup than SQLite and well-suited for key-value storage.


2. UX Design — Focus on Reading

Quiet's UX principle is simple: 90% of the screen is text.

Core features: - File loading: .txt and .epub support - Custom font/spacing/background: 5 themes (default, sepia, dark, black, green) - Page turning: tap, swipe, or volume button options - Bookmarks: position save and restore - Progress indicator: current position percentage

What was deliberately excluded matters more: - No social features (sharing, comments, reviews) - No server connection (no login required) - No ads (nothing to interrupt reading)

The goal is exactly what the name says: quiet reading.


4. Claude Code 페어 프로그래밍

3. Riverpod State Management in Practice

States managed in the text viewer:

  • ReadingState: current file, current position, total length
  • ThemeState: font size, line spacing, background color, text color
  • BookmarkState: saved bookmark list
  • SettingsState: page turn method, screen-on lock, etc.

Each state is managed independently with Riverpod's StateNotifier. Cross-state dependencies are handled reactively via ref.watch.

Practical lesson: over-fragmenting state causes Provider explosion. Grouping related state into a single StateNotifier is more manageable. Font size and line spacing belong together in ThemeState rather than as separate providers.


4. Pair Programming with Claude Code

Claude Code's role in Quiet's development: - Widget implementation: Drafting complex custom widgets (page viewer, settings panel) - State architecture: Designing and refactoring Riverpod provider structure - Bug fixing: Diagnosing Flutter build errors and state inconsistencies - Test writing: Widget tests and state tests

The harness structure (CLAUDE.md, skills, memory) was applied to app development just as with technical agents. Project rules, decisions, and lessons learned are systematically managed.


5. Play Store Submission

Preparing for Play Store submission was harder than building the app.

Requirements: - Google Play Developer account ($25 registration) - App icon (512x512) - Screenshots (minimum 2, recommended 8) - Feature graphic (1024x500) - App description (Korean + English) - Privacy policy URL

Review process notes: - Content rating: Determined by questionnaire. Text viewer qualifies for "Everyone" - Target age: Must explicitly state it's not targeting children - Data collection declaration: Hive local storage only, no external transmission

Submission to approval took approximately 3 days.


Lessons Learned

epub parsing complexity: .txt files are straightforward, but .epub is a compressed archive containing HTML + CSS + images. Depending on an epub parser library while needing custom rendering took much longer than expected.

Volume button page turning: Capturing volume buttons on Android requires platform channels. Pure Dart in Flutter can't do it — Kotlin native code was necessary.


Conclusion

Quiet started as "a simple text viewer" but became a project spanning the full Flutter app development lifecycle — design, implementation, testing, deployment. It's not a technically flashy app, but focusing on a single function (reading) allowed higher polish on what matters.

댓글

이 블로그의 인기 게시물

Agent Memory Engine (2/10) — Building an AI Agent Memory System with SQLite Alone

"ML Foundations (9/9) — PyTorch vs TensorFlow, and the Road to Local LLMs"

"RAG Core Study (14/26) — Evaluation Sets with RAGAS & DeepEval"

"ML Foundations (8/9) — Deep Learning Architectures: CNN, RNN, Attention"

"ML Foundations (7/9) — Deep Learning Training: Optimizers, Regularization, Initialization"

OpenClaw to Hermes Migration (2/13) — What to Preserve, Partially Port, or Discard

AI Agents I Built (5/7) — Building an Automated Blogger API Publishing System