---
name: flutter-dart-expert
description: "Expert guide for Flutter 3.27+ and Dart 3.7+ cross-platform development. Covers Material 3 adaptive theming, Riverpod 3, go_router, Impeller rendering, platform channels, and Firebase/Supabase integration / Panduan ahli pengembangan lintas platform Flutter 3.27+ dan Dart 3.7+."
author: "Roedy Rustam"
version: "4.4.2"
---
# Flutter & Dart Expert (Flutter 3.27 / Dart 3.7 Edition)
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
---
## English
### Orchestration & Integration
Connects with: `brainstorming`, `zero-to-prod-orchestrator`, `design-system-architect`, `ui-ux-pro-max`, `visual-ui-auditor`, `anti-slop`, `database-orm-expert`, `authentication-identity-expert`, `firebase-security-expert`, `ci-cd-devops-architect`, `e2e-testing-expert`, `apple-ecosystem-expert`, `session-memory-manager`.
### Description
Expert guide for building production-grade cross-platform applications using **Flutter 3.27+** and **Dart 3.7+**. Covers Material 3 adaptive theming, Riverpod 3 state management, go_router declarative navigation, Impeller rendering engine, platform channels, custom render objects, and Firebase/Supabase backend integration for iOS, Android, Web, macOS, Windows, and Linux targets.
### Trigger Conditions
- Building a new Flutter/Dart cross-platform application (mobile, web, desktop).
- Using **Riverpod 3** for state management with code generation.
- Implementing **Material 3** adaptive design with `ColorScheme.fromSeed`.
- Setting up **go_router** declarative navigation with typed routes.
- Writing **platform channels** (MethodChannel/EventChannel) or FFI.
- Integrating Flutter with Firebase, Supabase, or custom REST/GraphQL APIs.
- Optimizing rendering performance with **Impeller** (default engine).
- Building Flutter plugins or packages for pub.dev.
### What's New in 2026
#### Dart 3.7 — Language Improvements
- **Static Metaprogramming (Macros)**: Compile-time code generation for JSON serialization, data classes, and ORM models without build_runner.
- **Pattern Matching Enhancements**: Exhaustive switch expressions with sealed class hierarchies.
- **Extension Types (Stable)**: Zero-cost wrappers for type safety without runtime overhead.
- **Enhanced Enums**: Enum members with fields, methods, and interface implementations.
#### Flutter 3.27 — Framework Updates
- **Impeller (Default)**: Hardware-accelerated rendering engine — eliminates shader compilation jank on iOS, Android, and desktop.
- **Material 3 Complete**: Full M3 component set with adaptive layouts for mobile/tablet/desktop.
- **Platform Views v2**: Improved hybrid composition for embedding native views (maps, ads, WebView).
- **DevTools 2026**: Enhanced performance profiling, widget inspector, and memory analysis.
- **WebAssembly (Stable)**: Flutter web compiled to Wasm for near-native performance.
- **Dart-only Packages**: Build backend APIs with `dart_frog` or `shelf` using the same Dart codebase.
### Core Architecture Patterns
#### 1. Project Setup (Flutter 3.27 + Material 3)
```bash
# Create new Flutter project with all platforms
flutter create --platforms=android,ios,web,macos,windows,linux my_app
cd my_app
# Add core dependencies
flutter pub add flutter_riverpod riverpod_annotation
flutter pub add go_router
flutter pub add freezed_annotation json_annotation
flutter pub add dev:riverpod_generator dev:build_runner dev:freezed dev:json_serializable
```
#### 2. Material 3 Adaptive Theming
```dart
import 'package:flutter/material.dart';
class AppTheme {
static ThemeData light() => ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF1A73E8),
brightness: Brightness.light,
),
typography: Typography.material2021(),
visualDensity: VisualDensity.adaptivePlatformDensity,
);
static ThemeData dark() => ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF1A73E8),
brightness: Brightness.dark,
),
typography: Typography.material2021(),
visualDensity: VisualDensity.adaptivePlatformDensity,
);
}
```
#### 3. Riverpod 3 State Management (Code Generation)
```dart
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'user_provider.g.dart';
@riverpod
class UserNotifier extends _$UserNotifier {
@override
FutureOr build() async {
return await ref.watch(authRepositoryProvider).getCurrentUser();
}
Future signIn(String email, String password) async {
state = const AsyncLoading();
state = await AsyncValue.guard(
() => ref.read(authRepositoryProvider).signIn(email, password),
);
}
}
@riverpod
Future> products(ProductsRef ref, {required String category}) async {
final repo = ref.watch(productRepositoryProvider);
return repo.getByCategory(category);
}
```
#### 4. go_router Declarative Navigation
```dart
import 'package:go_router/go_router.dart';
final routerProvider = Provider((ref) {
final authState = ref.watch(authStateProvider);
return GoRouter(
initialLocation: '/',
redirect: (context, state) {
final isLoggedIn = authState.valueOrNull != null;
final isLoginRoute = state.matchedLocation == '/login';
if (!isLoggedIn && !isLoginRoute) return '/login';
if (isLoggedIn && isLoginRoute) return '/';
return null;
},
routes: [
GoRoute(path: '/login', builder: (_, __) => const LoginScreen()),
ShellRoute(
builder: (_, __, child) => AppShell(child: child),
routes: [
GoRoute(path: '/', builder: (_, __) => const HomeScreen()),
GoRoute(
path: '/products/:id',
builder: (_, state) => ProductScreen(
id: state.pathParameters['id']!,
),
),
],
),
],
);
});
```
#### 5. Freezed Data Classes & JSON Serialization
```dart
import 'package:freezed_annotation/freezed_annotation.dart';
part 'product.freezed.dart';
part 'product.g.dart';
@freezed
class Product with _$Product {
const factory Product({
required String id,
required String name,
required double price,
@Default('') String description,
@Default([]) List imageUrls,
required DateTime createdAt,
}) = _Product;
factory Product.fromJson(Map json) =>
_$ProductFromJson(json);
}
```
#### 6. Platform Channels (Native Interop)
```dart
// Dart side
class BatteryService {
static const _channel = MethodChannel('com.app/battery');
Future getBatteryLevel() async {
final level = await _channel.invokeMethod('getBatteryLevel');
return level ?? -1;
}
}
// Kotlin side (Android)
class BatteryPlugin : MethodCallHandler {
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method == "getBatteryLevel") {
val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val level = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
result.success(level)
} else {
result.notImplemented()
}
}
}
```
#### 7. Performance Best Practices
- **Impeller Engine**: Default in Flutter 3.27 — eliminates shader compilation jank. No action needed.
- **const constructors**: Mark widgets `const` wherever possible to skip rebuilds.
- **RepaintBoundary**: Isolate expensive paint operations.
- **ListView.builder**: Always use builder constructors for large lists.
- **Image caching**: Use `cached_network_image` with `CachedNetworkImageProvider`.
- **Isolates**: Use `Isolate.run()` for CPU-intensive work (JSON parsing, image processing).
- **DevTools profiling**: Monitor frame rendering, memory allocation, and widget rebuilds.
#### 8. Testing Strategy
```dart
// Unit test with Riverpod
void main() {
test('UserNotifier signs in successfully', () async {
final container = ProviderContainer(
overrides: [
authRepositoryProvider.overrideWithValue(MockAuthRepository()),
],
);
final notifier = container.read(userNotifierProvider.notifier);
await notifier.signIn('test@example.com', 'password');
expect(container.read(userNotifierProvider).value, isNotNull);
});
}
// Widget test
testWidgets('ProductCard displays name and price', (tester) async {
await tester.pumpWidget(
ProviderScope(
child: MaterialApp(home: ProductCard(product: testProduct)),
),
);
expect(find.text('Test Product'), findsOneWidget);
expect(find.text('\$29.99'), findsOneWidget);
});
// Integration test
integration_test/app_test.dart:
testWidgets('Full purchase flow', (tester) async {
app.main();
await tester.pumpAndSettle();
await tester.tap(find.text('Products'));
await tester.pumpAndSettle();
expect(find.byType(HomeScreen), findsOneWidget);
});
```
### Anti-Patterns to Avoid
1. **Using `setState` for complex state** — Use Riverpod 3 with code generation.
2. **Nested Navigator stacks** — Use go_router with ShellRoute for tab navigation.
3. **Heavy computation on main isolate** — Offload to `Isolate.run()`.
4. **Ignoring `const` constructors** — Causes unnecessary widget rebuilds.
5. **Using deprecated `Navigator.push`** — Migrate to go_router declarative navigation.
6. **Manual JSON serialization** — Use freezed + json_serializable with build_runner or Dart macros.
### Sovereign Execution, Token Efficiency & Invariants
| Dimension | Sovereign Mandate & Deterministic Contract |
| :--- | :--- |
| **Frontier Model Cascade** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) |
| **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) |
| **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out |
| **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec flutter-dart-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` |
| **NFR & Anti-Slop Invariants** | P99 API Gateway Latency < 85ms, OpenAPI 3.1 / TypeSpec strict schema parity, RFC 9457 Problem Details error contracts, Idempotency-Key enforcement; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` |
---
---
## Bahasa Indonesia
### Integrasi Orkestrasi
Terhubung dengan: `brainstorming`, `zero-to-prod-orchestrator`, `design-system-architect`, `ui-ux-pro-max`, `visual-ui-auditor`, `anti-slop`, `database-orm-expert`, `authentication-identity-expert`, `firebase-security-expert`, `ci-cd-devops-architect`, `e2e-testing-expert`, `apple-ecosystem-expert`, `session-memory-manager`.
### Deskripsi
Panduan ahli untuk membangun aplikasi lintas platform tingkat produksi menggunakan **Flutter 3.27+** dan **Dart 3.7+**. Mencakup theming adaptif Material 3, state management Riverpod 3, navigasi deklaratif go_router, mesin rendering Impeller, platform channels, custom render objects, dan integrasi backend Firebase/Supabase untuk target iOS, Android, Web, macOS, Windows, dan Linux.
### Kondisi Pemicu
- Membangun aplikasi lintas platform Flutter/Dart baru (mobile, web, desktop).
- Menggunakan **Riverpod 3** untuk state management dengan code generation.
- Mengimplementasikan desain adaptif **Material 3** dengan `ColorScheme.fromSeed`.
- Menyiapkan navigasi deklaratif **go_router** dengan typed routes.
- Menulis **platform channels** (MethodChannel/EventChannel) atau FFI.
- Mengintegrasikan Flutter dengan Firebase, Supabase, atau API REST/GraphQL kustom.
### Pola Arsitektur Inti
#### 1. Struktur Folder Standar
```
lib/
├── main.dart # Entry point & ProviderScope
├── app/ # Router & tema
│ ├── router.dart
│ └── theme.dart
├── features/ # Fitur berbasis domain
│ ├── auth/
│ │ ├── data/ # Repository, data source
│ │ ├── domain/ # Model, entity
│ │ └── presentation/ # Screen, widget, provider
│ └── products/
│ ├── data/
│ ├── domain/
│ └── presentation/
├── shared/ # Widget & utilitas bersama
│ ├── widgets/
│ └── utils/
└── core/ # Konstanta, konfigurasi, DI
├── constants.dart
└── providers.dart
```
#### 2. State Management dengan Riverpod 3
Gunakan `@riverpod` annotation untuk code generation otomatis. Pilihan provider:
- **`@riverpod`** (function): Untuk state sederhana, computed values, dan API calls.
- **`@riverpod` class**: Untuk state kompleks yang butuh methods (CRUD operations).
- **`AsyncNotifierProvider`**: Untuk state async dengan loading/error handling bawaan.
#### 3. Navigasi Deklaratif dengan go_router
Gunakan `GoRouter` dengan `ShellRoute` untuk navigasi tab, `redirect` untuk auth guards, dan `pathParameters` untuk deep linking.
#### 4. Praktik Terbaik Performa
- **Impeller Engine**: Default di Flutter 3.27 — menghilangkan shader jank.
- **`const` constructor**: Tandai widget `const` untuk menghindari rebuild yang tidak perlu.
- **`RepaintBoundary`**: Isolasi operasi paint mahal.
- **`ListView.builder`**: Selalu gunakan builder constructor untuk daftar panjang.
- **Isolates**: Gunakan `Isolate.run()` untuk komputasi berat (parsing JSON, pemrosesan gambar).
#### 5. Strategi Testing
- **Unit test**: Test provider dan repository dengan `ProviderContainer` overrides.
- **Widget test**: Test UI komponen secara isolasi dengan `testWidgets`.
- **Integration test**: Test alur pengguna lengkap dengan `integration_test` package.
### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian
| Dimensi | Mandat Berdaulat & Kontrak Deterministik |
| :--- | :--- |
| **Kaskade Model Frontier** | Medium / High (`GPT-5.6 Sol Medium`, `Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Grok 4.7 High Fast`) |
| **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) |
| **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out |
| **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec flutter-dart-expert ` / MCP: `vibes_skill_dispatch`, `vibes_ast_query`, `vibes_compile_cache`, `vibes_optimize_budget`, `vibes_verify_gate` |
| **Invarian NFR & Anti-Slop** | Latensi P99 API < 85ms, paritas skema ketat OpenAPI 3.1 / TypeSpec, kontrak error RFC 9457 Problem Details, penegakan Idempotency-Key; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |