Przejdź do głównej zawartości

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.

  • 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

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 @riverpod syntax (add riverpod_annotation, riverpod_generator, build_runner), go_router for navigation, dio for networking, and freezed for data classes. Use a feature-first folder layout (lib/features/<feature>/{data,domain,presentation}). Generate the build.yaml and a melos-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.

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.

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.

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.”

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.

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łąd build_runner do AI i poproś o ustalenie, czy przyczyną jest brakująca dyrektywa part, mieszanie starej składni z generowaniem kodu, czy niedopasowanie wersji między riverpod_annotation a riverpod_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.