Home Pricing Explore MCP Docs Create a project

Home/Blog/Guides

Build a Reading List App with FlutterGo, Then Review the Code It Wrote

Build a Flutter reading list app with FlutterGo from one prompt, test it in the preview, fix bugs with a follow-up, and review the generated Dart.

Most AI app builder tutorials end the moment the first screen appears. This one keeps going. We'll build a small reading list app called Shelfie from a single prompt, click through it in the preview to see what actually works, fix the bugs we find with a follow-up prompt, and then open the generated Dart to review it like a pull request from a new teammate.

Everything below was done on September 30, 2026, in the FlutterGo studio. The screenshots are from that session, and the bugs are the ones we really hit.

What you'll build

  • A Flutter app with a tabbed shelf (Want to Read, Reading, Finished), a book detail screen with page logging and a star rating, and an Add Book form
  • Navigation built on go_router, and state held in a single ChangeNotifier
  • A short, repeatable checklist for testing and reviewing whatever the AI generates

Time: about 15 minutes. You need: a FlutterGo account. No local Flutter install is required to follow along.

Step 1: Describe the app in one prompt

Open FlutterGo and type your idea into the box on the studio home screen. Be concrete about screens and data. You don't have to be exhaustive. Here's the exact prompt we used:

A reading list app called Shelfie. Screens: My Shelf with tabs for Want to Read,
Reading and Finished; a book detail screen with personal notes and a 1-5 star
rating; and an Add Book form (title, author, total pages). Books in Reading show
a progress bar for pages read. Warm, paper-like design with a serif heading font.
The FlutterGo studio home screen with the Shelfie prompt typed into the "Describe the app you want" box and the Start building button.
Step 1: the whole spec is one paragraph.

Three things make a prompt like this work well. It names every screen. It names the fields the Add Book form needs. And it describes one behavior that ties the data together, the progress bar for books you're reading. The styling line is optional but saves you a round of "make it warmer" later.

Click Start building. FlutterGo asks where data should live: connect Supabase for auth and a Postgres database, or Skip for now and design the screens first. We skipped. That means the app runs on in-memory sample data, which is fine for a first pass and easy to wire up to a backend later. If you want real persistence from day one, see building full-stack Flutter apps with Supabase.

Step 2: Watch the plan, design and build

The workspace opens with the chat on the left and an iPhone 16 preview on the right. While it builds, the progress card shows the stages it's working through (Plan, Design, Screens, Preview) and which file it's editing.

The finished first build in the FlutterGo chat: the Shelfie prompt, followed by a Work log with 67 steps and a Files card showing 104 files added.
Step 2: the finished first build, with 67 work-log steps and 104 files added.

In our run, the first build took a few minutes and finished with 104 files added: Dart sources, an Android and web scaffold, a Lottie animation and a handful of photos for book covers. The agent also added two screens we didn't ask for, Progress and Profile. That's worth noticing. AI builders tend to fill gaps generously, and part of your job is deciding what stays.

Step 3: Let auto-repair do its job, then read what it fixed

Before the preview ran, FlutterGo flagged two analyzer errors in its own code and fixed them:

The FlutterGo chat showing a "Fix 2 code errors" card for book_detail_screen.dart lines 426 and 435, where a value of type num could not be assigned to a double, followed by the agent's fix summary.
Step 3: two type errors caught and fixed before the preview ran.

Don't skip past this card. It tells you something real about the code. The page-step buttons computed the new value like this:

final next =
    (_draft + 10).clamp(0, book.totalPages.toDouble()).toDouble();

num.clamp is declared to return num (Dart API), so without the trailing .toDouble() the result can't be assigned to a double field. The repair appended it. It's a small fix, but it's a good sign that the build pipeline runs the analyzer instead of hoping. We've written more about how FlutterGo detects and fixes errors in generated code.

Step 4: Test the app like a user would

When the preview says Running, click through every flow you asked for. Don't just look at the first screen.

Two Shelfie screens in the iPhone 16 preview. Left: My Shelf with a hero card for Circe (214 pages in), tabs for Want (4), Reading (2) and Finished (3), and book cards with progress bars. Right: the Circe detail screen after tapping +10, showing 224 of 393 pages at 57 percent and a four-star rating.
Left: My Shelf. Right: book detail after tapping +10 and rating four stars.

Here's what we checked, and what happened:

  1. Book detail and page logging. We opened Circe, which showed 214 of 393 pages (54%), and tapped +10. It went to 224 of 393 (57%), and the slider moved with it.
  2. Rating. We tapped the fourth star. The rating saved, and a short caption appeared under the stars.
  3. Shared state. Back on My Shelf, the Circe card showed the new page count and a 4★ badge. That confirms both screens read from the same state object, not separate copies.

4. Add Book. We added The Left Hand of Darkness by Ursula K. Le Guin, 304 pages, straight onto the Reading shelf. It saved, a snackbar confirmed it, and the Reading count went from 2 to 3.

That last test surfaced three problems:

  • On the Add Book form, the selected genre chip was white text on light grey, hard to read, while the selected shelf chip looked fine.
  • The hero card said "1 pages in".
  • A new book added to Reading started at page 1 instead of 0, which explains the "1 pages" line.

None of these would show up in a screenshot of the first screen. You only find them by using the app.

Step 5: Fix what you found with one precise follow-up

Batch your fixes into one message and describe each bug by what you saw, not by how you think the code works:

Three fixes: 1) The selected genre chip on Add Book is white text on light grey
and hard to read. Give selected chips the same filled style as the selected shelf
chip. 2) The hero card says "1 pages in". Use "1 page" for singular. 3) A new
book added to Reading should start at 0 pages read, not 1.
The FlutterGo chat reply confirming all three fixes: genre chips now use the brick fill and cream text, the hero wording is singular-aware, and new Reading books start at 0 pages, with suggested next steps below.
Step 5: all three fixes landed in one pass, in 29 seconds.

Then test again. Don't trust the summary on its own. We re-ran the same Add Book flow: the selected chips now used the same filled style, and the new book showed "0 pages in" and "0 of 304 · 304 left".

Two Shelfie screens after the fixes. Left: the Add a book form filled in for The Left Hand of Darkness by Ursula K. Le Guin, 304 pages, with the selected Reading and Fiction chips in a filled brick-red style. Right: My Shelf after saving, with the hero reading 0 pages in, the new card showing 0 of 304 and 304 left, the Reading count at 3, and a confirmation snackbar.
After the fix: readable selected chips (left) and new books starting at zero pages (right).

Step 6: Review the code it wrote

A working preview is only half the job. You can open any generated file from the Files list in the chat, and the toolbar under the preview has GitHub and Download code buttons when you want the whole project in your own editor (export docs). Here's what we found when we read Shelfie's source.

Structure. Code is split by feature: lib/features/shelf/, book_detail/, add_book/, plus lib/data/ for models and state, lib/router/ and lib/theme/. The pubspec.yaml pulls in go_router, google_fonts, lottie, intl and flutter_svg, with flutter_lints in dev dependencies.

Navigation. lib/router/app_router.dart uses go_router's StatefulShellRoute.indexedStack for the three bottom tabs, and separate routes for /book/:id and /add-book.

State. All app data lives in one ShelfController extends ChangeNotifier. It's created in main() and passed to screens through their constructors, and screens rebuild with ListenableBuilder. After our follow-up, addBook() sets pagesRead: 0 as asked. This is the same ChangeNotifier + ListenableBuilder pattern the Flutter architecture case study uses, which makes it easy for any Flutter developer to follow. If you'd prefer Riverpod or Bloc, a small app like this is the cheapest time to switch. Our guide to Flutter state management in 2026 covers the tradeoffs.

One bug the preview didn't show. The ShelfBook model's copyWith uses the common finishedOn: finishedOn ?? this.finishedOn pattern. That means copyWith(finishedOn: null), which setStatus() calls when a book moves back to Reading, can't clear the date. A book you move from Finished back to Reading keeps its old finish date. We didn't see that date anywhere in the Reading views during testing, so clicking through the app wouldn't have caught it. Reading the code did. It's a well-known Dart pitfall, and the usual fix is a sentinel value or a separate clearFinishedOn flag. You can ask FlutterGo for that fix in one line.

Tests. The project ships with one widget smoke test that pumps the app and checks that "Shelfie" appears. That's a start, not coverage. Asking for a unit test on ShelfController (add a book, log pages, change status) is a good next prompt.

A checklist you can reuse

Whatever you build with an AI app builder, run the same loop:

  1. Prompt with screens, fields and one behavior that ties the data together.
  2. Read the auto-repair card. It tells you where the generated code was fragile.
  3. Click through every flow, including adding, editing and going back.
  4. Batch bug fixes into one precise prompt, described by what you saw.
  5. Re-test after every fix. Summaries aren't verification.
  6. Read the state and model code, where bugs hide that the UI can't show you.
  7. Decide what to keep. Remove unrequested screens or keep them on purpose.

Where to go next

Shelfie is a solid first draft: it builds, the core flows work, and the code is organized the way a Flutter developer would expect. The remaining work is the work you'd do on any codebase, including one bug fix, a few real tests, and choosing a backend.

If you want to try this yourself, open the FlutterGo studio and start with the prompt above. Then go one step further than we did: connect GitHub, pull the project into your editor, and run flutter analyze and flutter test locally.


Built and tested in FlutterGo on September 30, 2026. The app ran in FlutterGo's web preview in an iPhone 16 frame; we didn't install it on a physical device for this article, and we didn't run flutter analyze or flutter test outside FlutterGo.

  • Tutorial
  • FlutterGo
  • Flutter
  • go_router
  • ChangeNotifier

Build the app you just read about. Describe it in plain English — FlutterGo writes real Flutter code and gets it ready for both stores.

3 posts