Flutter Project Structure
Understanding how Flutter projects are organized
๐ What is Flutter Project Structure?
Flutter projects follow a specific folder structure to organize code, assets, and configurations. Understanding this structure helps you navigate and build apps efficiently with proper file organization.
my_app/
โโโ lib/
โ โโโ main.dart
โโโ android/
โโโ ios/
โโโ test/
โโโ pubspec.yaml
Key Folders & Files
lib/
Your Dart code lives here
lib/
โโโ main.dart
โโโ screens/
โโโ widgets/
pubspec.yaml
Project configuration & dependencies
dependencies:
flutter:
sdk: flutter
assets/
Images, fonts, and files
assets/
โโโ images/
โโโ fonts/
test/
Unit and widget tests
test/
โโโ widget_test.dart
๐น Complete Project Structure
Here's what a typical Flutter project looks like:
my_flutter_app/
โโโ android/ # Android-specific files
โโโ ios/ # iOS-specific files
โโโ lib/ # Main Dart code
โ โโโ main.dart # App entry point
โ โโโ screens/ # Screen widgets
โ โโโ widgets/ # Reusable widgets
โ โโโ models/ # Data models
โ โโโ services/ # API & services
โ โโโ utils/ # Helper functions
โโโ test/ # Test files
โโโ assets/ # Images, fonts, etc.
โ โโโ images/
โ โโโ fonts/
โโโ pubspec.yaml # Dependencies & config
โโโ pubspec.lock # Locked versions
โโโ analysis_options.yaml # Linting rules
โโโ README.md # Project documentation
๐น main.dart - Entry Point
Every Flutter app starts with main.dart:
// lib/main.dart
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home')),
body: Center(child: Text('Hello Flutter!')),
);
}
}
๐น pubspec.yaml Configuration
Manage dependencies and assets:
name: my_app
description: A new Flutter project
version: 1.0.0+1
environment:
sdk: ">=3.0.0 <4.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
http: ^1.1.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
# Add assets
assets:
- assets/images/
- assets/icons/
# Add fonts
fonts:
- family: Roboto
fonts:
- asset: assets/fonts/Roboto-Regular.ttf
- asset: assets/fonts/Roboto-Bold.ttf
weight: 700
๐น Organizing Code by Feature
Structure your lib/ folder for scalability:
lib/
โโโ main.dart
โโโ app.dart
โโโ features/
โ โโโ authentication/
โ โ โโโ screens/
โ โ โ โโโ login_screen.dart
โ โ โ โโโ signup_screen.dart
โ โ โโโ widgets/
โ โ โ โโโ login_form.dart
โ โ โโโ services/
โ โ โโโ auth_service.dart
โ โโโ home/
โ โโโ screens/
โ โ โโโ home_screen.dart
โ โโโ widgets/
โ โโโ home_card.dart
โโโ shared/
โ โโโ widgets/
โ โ โโโ custom_button.dart
โ โ โโโ loading_indicator.dart
โ โโโ utils/
โ โโโ constants.dart
โโโ core/
โโโ theme/
โ โโโ app_theme.dart
โโโ routes/
โโโ app_routes.dart
๐น Example: Organized Screen
Create a screen in the proper location:
// lib/features/profile/screens/profile_screen.dart
import 'package:flutter/material.dart';
import '../widgets/profile_header.dart';
import '../widgets/profile_stats.dart';
class ProfileScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Profile'),
),
body: Column(
children: [
ProfileHeader(),
ProfileStats(),
// More widgets...
],
),
);
}
}
๐น Adding Assets
Use images and assets in your app:
// 1. Add to pubspec.yaml
// flutter:
// assets:
// - assets/images/logo.png
// 2. Use in your code
class LogoWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Image.asset(
'assets/images/logo.png',
width: 100,
height: 100,
);
}
}
๐น Platform-Specific Folders
Android and iOS configurations:
android/
- app/build.gradle - App configuration
- app/src/main/AndroidManifest.xml - Permissions
- app/src/main/res/ - Icons and resources
ios/
- Runner.xcworkspace - Xcode project
- Runner/Info.plist - App configuration
- Runner/Assets.xcassets - App icons