A complete Flutter learning project built to demonstrate best practices for:
- Fetching data from APIs
- Using BLoC/Cubit for state management
- Implementing the Repository pattern
- Organizing code with clean architecture
- Applying router navigation for screens
- Adding search functionality
- Using Hero animations for smooth navigation transitions
- Customizing SliverAppBar for better UX
- Following clean linting rules and project conventions
β
- Fetch data from REST API using Dio / WebServices layer
β
- Manage state using BLoC / Cubit
β
- Organize project with Repository Pattern
β
- Navigation via AppRouters class
β
- Implement Search filter inside GridView
β
- Add Hero widget for transition between Character list and details
β
- Beautiful SliverAppBar in details screen
β
- Handle loading, success, and error states gracefully
β
- Clean, modular, and readable project structure
β
- Proper lint rules configuration in analysis_options.yaml
lib/
βββ business_logic/
β βββ cubit/
β βββ character_cubit.dart
βββ constants/
β βββ colors.dart
β βββ strings.dart
βββ core/
β βββ bloc_observer.dart
βββ data/
β βββ models/
β β βββ character.dart
β βββ repository/
β β βββ characters_repository.dart
β βββ web_services/
β βββ characters_web_services.dart
βββ presentation/
β βββ screens/
β β βββ characters_screen.dart
β β βββ characters_details.dart
β βββ widgets/
β βββ character_item.dart
βββ app_router.dart
This structure follows Clean Architecture principles:
- WebServices β responsible for API calls
- Repository β connects data layer and business logic
- Cubit/BLoC β handles states and logic
- Presentation β displays data in UI
| Package | Purpose |
|---|---|
flutter_bloc |
State management |
dio |
API networking |
equatable |
Easier Cubit state comparisons |
cached_network_image |
Efficient image loading |
flutter_lints |
Enforcing code style |
google_fonts |
Custom typography |
animations |
For Hero and transitions |
Users can search for characters by name (case-insensitive).
It filters results dynamically inside the GridView using Cubit state updates.
- CharactersScreen: Displays all characters in a responsive grid
- CharacterItem: Card with image and name
- CharacterDetailsScreen: Opens with smooth Hero transition + SliverAppBar
- Error & Loading states handled elegantly using widgets
- Consistent spacing, rounded corners, and shadows for a clean look
App navigation is managed by AppRouters:
switch (settings.name) {
case ConstantStrings.characterScreen:
return MaterialPageRoute(
builder: (_) => BlocProvider(
create: (context) => CharacterCubit(repository),
child: const CharactersScreen(),
),
);
case ConstantStrings.characterScreenDetails:
final character = settings.arguments as Character;
return MaterialPageRoute(
builder: (_) => CharactersDetails(character: character),
);
}Each feature has its own Cubit class (e.g. CharacterCubit) that:
- Fetches data via Repository
- Emits Loading β Success β Error states
- Allows filtering (search)
Example:
class CharacterCubit extends Cubit<CharacterState> {
final CharactersRepository charactersRepository;
CharacterCubit(this.charactersRepository) : super(CharacterInitial());
void getAllCharacters() async {
emit(CharacterLoading());
try {
final characters = await charactersRepository.getAllCharacters();
emit(CharacterLoaded(characters));
} catch (e) {
emit(CharacterError(e.toString()));
}
}
}-
Clone the repository:
git clone https://github.com/your-username/Characters.git
-
Navigate to project folder:
cd Characters -
Get dependencies:
flutter pub get
-
Run the app:
flutter run
This project is perfect for anyone who wants to:
- Learn Flutter + BLoC/Cubit from a real example
- Understand Clean Architecture pattern
- Practice API fetching + Repository separation
- Master navigation, search, and Hero animation
- Write clean and lint-approved Flutter code
Feel free to fork, open issues, and submit pull requests. This project is meant for learning and collaboration!
Mohammad Hmedat π¨βπ» - Software Engineer | Flutter & .NET Developer π - Passionate about clean code, architecture, and building learning projects π§ - [humedat23@gmail.com]