Daily Report: FSI Deutsch App First Run · Environment Setup & Debugging — Mar 22, 2026


Why I Wanted to Build This App

While researching German learning methods recently, I came across the FSI (Foreign Service Institute) language course system. The FSI is a training institution under the U.S. Department of State, originally designed to provide intensive language training for diplomats. Its courses cover dozens of languages and are known for being rigorous and systematic. One of the core training techniques in the FSI German curriculum is Substitution Drills — you take a fixed sentence frame and repeatedly swap out vocabulary or grammatical components, drilling through massive repetition until the correct forms become second nature.

This approach fits my current needs perfectly: I have a decent grasp of German grammar, but when it comes to speaking, I still hesitate and make mistakes. I couldn’t find a good app on the market for this kind of drill, so I decided to build one myself — FSI Deutsch, a Flutter iOS app focused on German substitution drills, to systematically improve my spoken output.


What I Did Today

1. Project Setup

  • Created the Flutter project skeleton via flutter create
  • Imported pre-written source code (lib/, pubspec.yaml, analysis_options.yaml) and drill data (5 JSON files, A1–C1, totaling 1,692 exercises)
  • Ran flutter pub get to install 69 dependency packages
  • Ran pod install to install iOS native dependencies

2. Quick Start Guide Rewrite

Rewrote the existing quick start guide from scratch:

  • Introduced a $SOURCE variable convention for clear path configuration
  • Switched all commands to absolute paths to avoid cd mishaps
  • Added verification steps and a troubleshooting table
  • Included a complete copy-paste-ready command block

3. Debugging

Bug #1: CardTheme API Rename

Symptom: Build failure — Xcode reported Could not build the application for the simulator.

Cause: In newer versions of Flutter, CardTheme was renamed to CardThemeData, but the theme.dart copied from the source directory still used the old API.

Fix: Replaced two occurrences of CardTheme( with CardThemeData( in lib/config/theme.dart, and synced the change back to the source directory.

Bug #2: Vocab Hints Showing Wrong Content

Symptom: The “Vocab Hint” card in the drill UI was displaying prompt_zh (Chinese prompt) instead of template (the German vocabulary list).

Investigation:

  1. _buildVocabCard → reads item.template — logic correct ✓
  2. DrillItem model JSON parsing → field mapping correct ✓
  3. DatabaseHelper database read → column mapping correct ✓
  4. loadSeedDatafound the issue: if existing data is detected, it returns immediately without updating

Root Cause: The simulator still had an old database (version 1) where the template field contained stale data. loadSeedData saw existing records and skipped the import, so the new data never made it in.

Fix:

  • constants.dart: bumped dbVersion from 12
  • database_helper.dart: added an onUpgrade callback that drops all old tables and rebuilds
  • Full app restart (not hot reload) — the database auto-upgraded and reloaded JSON data

Screenshot

The app running successfully on the iOS simulator — B1 grammar category page:

FSI Deutsch App — B1 Grammar Categories


Current Status

  • ✅ App running successfully on the iOS simulator
  • ✅ Vocab hints now correctly display template content
  • ✅ Quick start guide fully updated
  • ✅ Source directory and dev directory in sync

Next Steps

  • On-device testing (iPhone deployment + code signing)
  • Feature walkthrough: drill flows across all levels, progress tracking, answer feedback
  • Continue fixing layout and content/vocab hint display issues