Wzorce rozwoju Flutter
Prosisz AI o provider Riverpod, dostajesz StateNotifierProvider ze starą składnią, Twoja baza kodu używa adnotacji @riverpod z generowaniem kodu, a teraz build_runner wyrzuca błędy o sprzecznych wygenerowanych plikach. Albo AI pisze widget, który przebudowuje całe drzewo przy każdym naciśnięciu klawisza, a lista zacina się na Androidzie ze średniej półki. Problem Fluttera rzadko brzmi „czy AI potrafi pisać Dart” - chodzi o to, że Dart ma trzy poprawne sposoby na zrobienie wszystkiego, a AI raz po raz je miesza.
Ten przepis pokazuje przepływy pracy z Flutter, które produkują kod pasujący do Twojej istniejącej architektury, w Cursor, Claude Code i Codex.
Co z tego wyniesiesz
Dział zatytułowany „Co z tego wyniesiesz”- Prompt do szkieletu, który przypina Twoje wybory stanu, routingu i networkingu, żeby AI przestało mieszać wzorce
- Gotowy do wklejenia prompt na asynchroniczny provider Riverpod z generowaniem kodu (
@riverpod), który obsługuje cachowanie i odświeżanie - Prompt na go_router z przekierowaniem autoryzacji, które się nie zapętla
- Prompt na serwis API z Dio z interceptorami, ponawianiem i typowanymi modelami
- Mapę „Gdy to się sypie” z awariami, które naprawdę kosztują czas: dryf
build_runner, Gradle/CocoaPods i niestabilność testów golden
Tworzenie szkieletu aplikacji Flutter
Dział zatytułowany „Tworzenie szkieletu aplikacji Flutter”Domyślne ustawienia Fluttera zmieniają się między wersjami głównymi, więc podaj stos jawnie. Na czerwiec 2026 aktualną linią główną jest Riverpod 3.x ze składnią @riverpod z generowaniem kodu, go_router do nawigacji i dio do networkingu.
Otwórz Cursor w pustym folderze, wejdź w tryb Agent (Cmd/Ctrl + I) i wklej:
Scaffold a new Flutter app with
flutter create. Set up Material 3, Riverpod 3.x using the code-generation@riverpodsyntax (addriverpod_annotation,riverpod_generator,build_runner),go_routerfor navigation,diofor networking, andfreezedfor data classes. Use a feature-first folder layout (lib/features/<feature>/{data,domain,presentation}). Generate thebuild.yamland amelos-free single-package setup.
Tryb Agent uruchamia flutter create, edytuje pubspec.yaml i wykonuje dart run build_runner build. Przejrzyj wersje zależności, które przypina.
Z pustego katalogu:
claude "Scaffold a Flutter app with Material 3, Riverpod 3.x (code-generation \@riverpod syntax), go_router, dio, and freezed. Use a feature-first folder \layout and run build_runner once to verify codegen."Następnie utrzymuj sesję ciepłą: claude "now add a typed AppConfig from --dart-define-from-file with a dev and prod flavor".
Prompty Codex CLI są pozycyjne. Z pustego katalogu:
codex "Scaffold a Flutter app with Material 3, Riverpod 3.x using the \code-generation @riverpod syntax, go_router, dio, and freezed. Feature-first \folder layout. Run build_runner to verify generated files compile."Przy dłuższej pętli generowania i weryfikacji codex --full-auto pozwala mu uruchamiać build_runner i flutter analyze bez pytania o każde polecenie, albo przekaż to do Codex Cloud, żeby zbudował szkielet i otworzył PR.
Stan z Riverpod i generowaniem kodu
Dział zatytułowany „Stan z Riverpod i generowaniem kodu”Zyskiem z adnotacji @riverpod jest to, że asynchroniczne ładowanie, cachowanie i parametry family stają się deklaratywne. Poproś o to wprost.
Jak ocenić wynik: musi zawierać dyrektywę part '*.g.dart'; i używać zunifikowanego Ref (Riverpod 3.x porzucił generowane per-provider refy w stylu UserProfileRef), a nie starego AutoDisposeFutureProviderRef. Jeśli gdziekolwiek widzisz StateNotifier, wróciło do starego stylu - odeślij to. Uruchom dart run build_runner build --delete-conflicting-outputs i potwierdź, że się kompiluje, zanim mu zaufasz.
Nawigacja z go_router
Dział zatytułowany „Nawigacja z go_router”Przekierowanie autoryzacji w go_router to klasyczny błąd nieskończonej pętli: przekierowujesz niezalogowanych użytkowników do /login, ale zapominasz przepuścić samo /login przez bramkę, i router odbija się w nieskończoność.
Sprawdź, czy przekierowanie zwraca null dla samych tras autoryzacji - ta jedna klauzula bramki jest tym, co zapobiega pętli, i jest linią, którą AI najczęściej pomija.
Networking z Dio
Dział zatytułowany „Networking z Dio”Oceniaj go po obsłudze błędów: ścieżka happy path jest trywialna, ale to odświeżenie tokenu z ponowieniem przy 401 oraz typowane ApiFailure czynią z tego kod produkcyjny. Jeśli AI tylko ponownie rzuca DioException, odeślij to z poleceniem „map every DioException to the sealed ApiFailure.”
Czysta architektura
Dział zatytułowany „Czysta architektura”W większych aplikacjach prompt o warstwy warto dopracować raz. Daj AI konkretną funkcję, a nie abstrakcyjne „ustaw czystą architekturę”.
Ograniczenie, które ma znaczenie: warstwa domeny nie może importować Fluttera ani dio. Poproś AI o potwierdzenie tego, a potem wyrywkowo sprawdź importy - przeciekły package:flutter/material.dart w use case to sygnał, że podział na warstwy jest tylko kosmetyczny.
Testowanie
Dział zatytułowany „Testowanie”Gdy to się sypie
Dział zatytułowany „Gdy to się sypie”Tryby awarii poniżej to miejsca, gdzie Flutter + AI najczęściej idzie w bok:
- Dryf
build_runner. Objawy: „conflicting outputs”, nieaktualny wygenerowany kod albo provider, który „nie istnieje”. Naprawa:dart run build_runner build --delete-conflicting-outputs, a jeśli dalej stawia opór,flutter clean, a potem regenerowanie. Wklej dokładny błądbuild_runnerdo AI i poproś o ustalenie, czy przyczyną jest brakująca dyrektywapart, mieszanie starej składni z generowaniem kodu, czy niedopasowanie wersji międzyriverpod_annotationariverpod_generator. - Awarie Gradle i CocoaPods. Awarie buildu Androida po podbiciu zależności to zwykle niedopasowanie wersji Gradle/AGP lub Kotlina; awarie iOS to zwykle Pod, który potrzebuje
pod repo update, albo wyższy docelowy poziom wdrożenia iOS. Wklej pełny log buildu i poproś AI o przypięcie konkretnych wersji - nie pozwól mu podbijać Flutter SDK, żeby „naprawić” problem z Podem. - Niestabilność testów golden w CI. Goldeny renderowane lokalnie na macOS nie będą pasować piksel w piksel do runnera CI na Linuksie z powodu renderowania czcionek. Generuj i weryfikuj goldeny na jednym OS-ie albo wczytaj dołączoną czcionkę testową. Jeśli goldeny są niestabilne, poproś AI o dodanie
flutter_test_config.dart, które wczytuje stałą czcionkę przed uruchomieniem testów.
Co dalej
Dział zatytułowany „Co dalej”- Wzorce rozwoju Expo, jeśli porównujesz stosy cross-platform
- Wzorce React Native dla porównania po stronie JS
- Integracja backendu dla API, z którym rozmawia Twój
ApiService