Clean Architecture helps organize your app into clear parts. This makes your app easier to build, test, and change later.
Clean Architecture layers in Flutter
Presentation Layer Domain Layer Data Layer
Presentation Layer: Shows UI and handles user actions.
Domain Layer: Contains app rules and logic, independent of UI or data.
Data Layer: Manages data sources like APIs or databases.
Presentation Layer: Flutter widgets, UI code Domain Layer: Use cases, business rules Data Layer: API calls, database access
Presentation Layer -> calls -> Domain Layer -> calls -> Data Layer
This Flutter app shows a simple example of Clean Architecture layers. The domain layer has a use case that returns a greeting. The presentation layer shows this greeting in the UI.
import 'package:flutter/material.dart'; // Domain Layer: simple use case class GetGreeting { String call() => 'Hello from Domain Layer!'; } // Presentation Layer: UI widget class MyApp extends StatelessWidget { final GetGreeting getGreeting = GetGreeting(); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar(title: Text('Clean Architecture Example')), body: Center( child: Text(getGreeting()), ), ), ); } } void main() => runApp(MyApp());
Keep domain layer free from Flutter or platform code to make it reusable.
Presentation layer depends on domain layer, but domain layer does not depend on presentation.
Data layer handles where data comes from, like web or local storage.
Clean Architecture divides app into Presentation, Domain, and Data layers.
This separation makes apps easier to maintain and test.
Presentation handles UI, Domain handles logic, Data handles data sources.
Practice
Solution
Step 1: Understand the role of each layer
The Presentation layer manages UI elements and user interactions.Step 2: Match the layer to UI responsibility
Since UI is about what the user sees and interacts with, it belongs to the Presentation layer.Final Answer:
Presentation layer -> Option BQuick Check:
UI = Presentation layer [OK]
- Confusing Domain layer with UI
- Thinking Data layer handles UI
- Assuming Network layer is part of UI
Solution
Step 1: Identify the Domain layer's responsibility
The Domain layer contains the core business logic and rules of the app.Step 2: Eliminate incorrect options
Data storage is Data layer, UI is Presentation, network is part of Data or external services.Final Answer:
It contains business logic and rules. -> Option AQuick Check:
Domain = Business logic [OK]
- Mixing Domain with Data layer
- Thinking Domain manages UI
- Confusing network tasks with Domain
lib/
presentation/
domain/
repositories/
data/
repositories_impl/
Solution
Step 1: Understand repository interface placement
Repository interfaces define contracts for data access and belong in the Domain layer.Step 2: Check the folder structure
Domain layer has 'repositories' folder for interfaces; Data layer has 'repositories_impl' for implementations.Final Answer:
Domain layer -> Option CQuick Check:
Repository interface = Domain layer [OK]
- Putting interfaces in Data layer
- Confusing UI layer with Presentation
- Ignoring folder naming conventions
Solution
Step 1: Identify the problem with API calls in UI
API calls belong in the Data layer, not in UI widgets.Step 2: Understand separation of concerns
Mixing UI and data logic breaks Clean Architecture principles, making code harder to maintain.Final Answer:
It violates the separation of concerns by mixing UI and data logic. -> Option AQuick Check:
UI should not contain data logic [OK]
- Thinking mixing layers improves performance
- Assuming Domain layer handles UI
- Believing this is best practice
Solution
Step 1: Identify JSON conversion responsibility
Converting JSON to Dart objects is a data transformation task, part of data handling.Step 2: Match task to Clean Architecture layer
Data layer handles data sources and transformations, so JSON parsing belongs here.Step 3: Exclude other layers
Presentation is UI only, Domain is business rules, main.dart is app entry point, not for data parsing.Final Answer:
In the Data layer within model or mapper classes -> Option DQuick Check:
JSON parsing = Data layer [OK]
- Parsing JSON in UI widgets
- Putting parsing in Domain layer logic
- Adding parsing code in main.dart
Ready to prove it?
Pass the test and this pattern moves unknown
