Flutter SDK for cross-platform development targeting iOS, Android, and Web. Use for widget architecture, state management, platform channels, and multi-platform deployment.
Flutter is Google's UI toolkit for building natively compiled applications for mobile (iOS, Android), web, and desktop from a single Dart codebase.
Flutter CLI can enter interactive mode which will hang Claude Code. Always use flags to bypass prompts:
| Command | WRONG (Interactive) | CORRECT (Non-Interactive) |
|---|---|---|
| Create project | flutter create (prompts) |
flutter create my_app --org com.example |
| Run app | flutter run (prompts for device) |
flutter run -d <device_id> |
| Build | flutter build (may prompt) |
flutter build apk --release |
| Emulators | flutter emulators --launch |
flutter emulators --launch <emulator_id> |
Always include:
-d <device_id> for device selection (use flutter devices to list)apk, appbundle, ios, web)--no-pub when pub get is not needed--suppress-analytics in CI/CD environmentsNever use in Claude Code:
flutter --version # Expected: Flutter 3.x.x
flutter doctor # Check all requirements
flutter devices # List available devices
flutter emulators # List available emulators
āāā Create new project āāāāāāāāāāāāāāāāāŗ flutter create <name> --org <org>
āāā Get dependencies āāāāāāāāāāāāāāāāāāāŗ flutter pub get
āāā Upgrade dependencies āāāāāāāāāāāāāāāŗ flutter pub upgrade
āāā Clean build artifacts āāāāāāāāāāāāāāŗ flutter clean
āāā Check project health āāāāāāāāāāāāāāāŗ flutter doctor
āāā Run on device āāāāāāāāāāāāāāāāāāāāāāŗ flutter run -d <device_id>
āāā Run in release mode āāāāāāāāāāāāāāāāŗ flutter run --release -d <device_id>
āāā Attach to running app āāāāāāāāāāāāāāŗ flutter attach -d <device_id>
āāā View logs āāāāāāāāāāāāāāāāāāāāāāāāāāŗ flutter logs -d <device_id>
āāā Build Android APK āāāāāāāāāāāāāāāāāāŗ flutter build apk --release
āāā Build Android App Bundle āāāāāāāāāāāŗ flutter build appbundle --release
āāā Build iOS āāāāāāāāāāāāāāāāāāāāāāāāāāŗ flutter build ios --release
āāā Build iOS (no codesign) āāāāāāāāāāāāŗ flutter build ios --release --no-codesign
āāā Build Web āāāāāāāāāāāāāāāāāāāāāāāāāāŗ flutter build web --release
āāā Run all tests āāāāāāāāāāāāāāāāāāāāāāŗ flutter test
āāā Run specific test file āāāāāāāāāāāāāŗ flutter test test/widget_test.dart
āāā Run with coverage āāāāāāāāāāāāāāāāāāŗ flutter test --coverage
āāā Run integration tests āāāāāāāāāāāāāāŗ flutter test integration_test/
āāā Analyze code āāāāāāāāāāāāāāāāāāāāāāāŗ flutter analyze
āāā Format code āāāāāāāāāāāāāāāāāāāāāāāāŗ dart format .
āāā Fix lint issues āāāāāāāāāāāāāāāāāāāāŗ dart fix --apply
See REFERENCE.md for complete CLI options, flavors, and advanced build configurations.
my_app/
āāā lib/
ā āāā main.dart # Entry point
ā āāā app.dart # App widget
ā āāā features/ # Feature modules
ā ā āāā auth/
ā ā āāā data/ # Repositories, data sources
ā ā āāā domain/ # Entities, use cases
ā ā āāā presentation/ # Widgets, providers
ā āāā core/ # Shared utilities
ā āāā l10n/ # Localization
āāā test/ # Unit and widget tests
āāā integration_test/ # Integration tests
āāā android/ # Android platform code
āāā ios/ # iOS platform code
āāā web/ # Web platform code
āāā pubspec.yaml # Dependencies
āāā analysis_options.yaml # Lint rules
See REFERENCE.md for complete pubspec.yaml and analysis_options.yaml configurations.
// Provider definition
@riverpod
class Counter extends _$Counter {
@override
int build() => 0;
void increment() => state++;
void decrement() => state--;
}
// Usage in widget
class CounterWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
return Text('Count: $count');
}
}
class CartNotifier extends ChangeNotifier {
final List<Item> _items = [];
List<Item> get items => List.unmodifiable(_items);
void addItem(Item item) {
_items.add(item);
notifyListeners();
}
}
// Usage
final cart = context.watch<CartNotifier>();
// Events and States
sealed class AuthEvent {}
class LoginRequested extends AuthEvent {
final String email, password;
LoginRequested(this.email, this.password);
}
sealed class AuthState {}
class AuthLoading extends AuthState {}
class AuthSuccess extends AuthState { final User user; AuthSuccess(this.user); }
// Bloc
class AuthBloc extends Bloc<AuthEvent, AuthState> {
AuthBloc() : super(AuthInitial()) {
on<LoginRequested>(_onLoginRequested);
}
}
See REFERENCE.md for complete Riverpod architecture, Bloc patterns, and provider types.
class UserCard extends StatelessWidget {
final User user;
final VoidCallback? onTap;
const UserCard({required this.user, this.onTap, super.key});
@override
Widget build(BuildContext context) {
return Card(
child: ListTile(
leading: CircleAvatar(backgroundImage: NetworkImage(user.avatarUrl)),
title: Text(user.name),
subtitle: Text(user.email),
onTap: onTap,
),
);
}
}
class SearchField extends StatefulWidget {
final ValueChanged<String> onChanged;
const SearchField({required this.onChanged, super.key});
@override
State<SearchField> createState() => _SearchFieldState();
}
class _SearchFieldState extends State<SearchField> {
final _controller = TextEditingController();
Timer? _debounce;
@override
void dispose() {
_debounce?.cancel();
_controller.dispose();
super.dispose();
}
void _onSearchChanged(String value) {
_debounce?.cancel();
_debounce = Timer(const Duration(milliseconds: 300), () {
widget.onChanged(value);
});
}
@override
Widget build(BuildContext context) {
return TextField(controller: _controller, onChanged: _onSearchChanged);
}
}
See REFERENCE.md for compound widgets, builder patterns, and hook widgets.
final router = GoRouter(
initialLocation: '/',
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomeScreen(),
routes: [
GoRoute(
path: 'user/:id',
builder: (context, state) {
final id = state.pathParameters['id']!;
return UserScreen(userId: id);
},
),
],
),
],
errorBuilder: (context, state) => ErrorScreen(error: state.error),
);
// Usage
context.go('/user/123');
context.push('/user/123');
context.pop();
See REFERENCE.md for deep linking, shell routes, and platform-specific configuration.
import 'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;
Widget build(BuildContext context) {
if (kIsWeb) return WebSpecificWidget();
if (Platform.isIOS) return CupertinoWidget();
if (Platform.isAndroid) return MaterialWidget();
return DefaultWidget();
}
class BatteryLevel {
static const platform = MethodChannel('com.example.app/battery');
Future<int> getBatteryLevel() async {
try {
return await platform.invokeMethod('getBatteryLevel');
} on PlatformException catch (e) {
throw Exception('Failed: ${e.message}');
}
}
}
See REFERENCE.md for iOS/Android native code, conditional imports, and event channels.
flutter build web --web-renderer canvaskit # Better fidelity, larger
flutter build web --web-renderer html # Smaller size
flutter build web --web-renderer auto # Auto-detect
Best for: Internal tools, dashboards, PWAs, authenticated apps Note: Flutter web renders to canvas - limited SEO by default
void main() {
testWidgets('Counter increments', (tester) async {
await tester.pumpWidget(const MyApp());
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('1'), findsOneWidget);
});
}
testWidgets('Button matches golden', (tester) async {
await tester.pumpWidget(MaterialApp(home: MyButton(label: 'Submit')));
await expectLater(find.byType(MyButton), matchesGoldenFile('goldens/my_button.png'));
});
// Update: flutter test --update-goldens
See REFERENCE.md for integration tests, provider testing, and complete test patterns.
| Error | Solution |
|---|---|
No connected devices |
Run flutter devices, start emulator |
Gradle build failed |
Run flutter doctor, check Android Studio |
CocoaPods not installed |
sudo gem install cocoapods |
pub get failed |
Check pubspec.yaml, run flutter clean |
flutter run -v # Verbose output
flutter doctor -v # Check for issues
flutter clean && flutter pub get # Clean rebuild
See REFERENCE.md for complete troubleshooting guide and CI/CD issues.
- uses: subosito/flutter-action@v2
with:
flutter-version: "3.24.0"
channel: stable
cache: true
- run: flutter pub get
- run: flutter analyze
- run: flutter test --coverage
- run: flutter build apk --release
See REFERENCE.md for complete GitHub Actions workflows and multi-platform builds.
This skill auto-loads when Flutter context is detected:
File-based triggers:
pubspec.yaml with flutter dependencylib/main.dart present.dart files in projectandroid/ and ios/ directoriesContext-based triggers:
| Agent | Use Case |
|---|---|
mobile-developer |
Primary agent for Flutter development |
deep-debugger |
Performance profiling, crash analysis |
code-reviewer |
Dart code review, accessibility audit |
deployment-orchestrator |
App store submissions |
Handoff to Deep-Debugger: