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

๐Ÿง  Test Your Knowledge

Where should you write your main Dart code?