Skip to content

Flutter auth app with TDD Clean Architecture

Notifications You must be signed in to change notification settings

bahrie127/flutter_auth_app

 
 

Repository files navigation


Flutter App Auth 📱

This is App with Auth Function like Login and Register. All API using reqres.in.
This app also implementing Flutter Clean Architecture with TDD.

demo.mp4

Pre-requisites 📐

Technology Recommended Version Installation Guide
Flutter v3.0.4 Flutter Official Docs
Dart v2.17.5 Installed automatically with Flutter

Get Started 🚀

  • Clone this project
  • Run flutter pub get
  • Run flutter gen-l10n to generate localization files
  • Run flutter pub run build_runner build --delete-conflicting-outputs to generate freezes files
  • Run flutter run --flavor stg -t lib/main_stg.dart for staging or
  • Run flutter run --flavor prd -t lib/main_prd.dart for production
  • Run Test flutter test
  • To generate launcher icon based on Flavor flutter pub run flutter_launcher_icons:main -f flutter_launcher_icons*
  • To generate mock class flutter pub run build_runner build

Feature ✅

  • BLoC State Management
  • Clean Architecture with TDD
    • Unit Test
    • Widget Test
    • BLoC test
  • Theme Configuration : System, Light, Dark
  • Multi Language : English, Bahasa
  • Login, Register Example
  • Pagination Example
  • Autofill Username and Password

TODO 📝

  • Integration Test
  • Implement multi flavor
  • Implement Go Router

Architecture Proposal by Resocoder


architecture-proposal

Project Structure


lib/
├── config.dart
├── core
│   ├── app_route.dart
│   ├── core.dart
│   ├── core_mapper.dart
│   ├── error
│   │   ├── error.dart
│   │   ├── exceptions.dart
│   │   └── failure.dart
│   ├── localization
│   │   ├── generated
│   │   │   ├── strings.dart
│   │   │   ├── strings_en.dart
│   │   │   └── strings_id.dart
│   │   ├── intl_en.arb
│   │   ├── intl_id.arb
│   │   ├── l10n.dart
│   │   └── localization.dart
│   ├── network
│   │   ├── dio_client.dart
│   │   ├── dio_interceptor.dart
│   │   ├── list_api.dart
│   │   └── network.dart
│   ├── resources
│   │   ├── dimens.dart
│   │   ├── images.dart
│   │   ├── palette.dart
│   │   ├── resources.dart
│   │   └── styles.dart
│   ├── usecase
│   │   └── usecase.dart
│   └── widgets
│       ├── button.dart
│       ├── button_notification.dart
│       ├── button_text.dart
│       ├── circle_image.dart
│       ├── color_loaders.dart
│       ├── drop_down.dart
│       ├── empty.dart
│       ├── loading.dart
│       ├── my_appbar.dart
│       ├── parent.dart
│       ├── spacer_h.dart
│       ├── spacer_v.dart
│       ├── text_f.dart
│       ├── toast.dart
│       └── widgets.dart
├── dependencies_injection.dart
├── features
│   ├── auth
│   │   ├── auth.dart
│   │   ├── data
│   │   │   ├── data.dart
│   │   │   ├── datasources
│   │   │   │   ├── auth_remote_datasources.dart
│   │   │   │   └── datasources.dart
│   │   │   ├── models
│   │   │   │   ├── login_response.dart
│   │   │   │   ├── models.dart
│   │   │   │   └── register_response.dart
│   │   │   └── repositories
│   │   │       ├── auth_repository_impl.dart
│   │   │       └── repositories.dart
│   │   ├── domain
│   │   │   ├── domain.dart
│   │   │   ├── entities
│   │   │   │   ├── entities.dart
│   │   │   │   ├── login.dart
│   │   │   │   └── register.dart
│   │   │   ├── repositories
│   │   │   │   ├── auth_repository.dart
│   │   │   │   └── repositories.dart
│   │   │   └── usecases
│   │   │       ├── post_login.dart
│   │   │       ├── post_register.dart
│   │   │       └── usecases.dart
│   │   └── presentation
│   │       ├── login
│   │       │   ├── cubit
│   │       │   │   ├── auth_cubit.dart
│   │       │   │   ├── auth_state.dart
│   │       │   │   └── cubit.dart
│   │       │   ├── login.dart
│   │       │   └── login_page.dart
│   │       ├── presentation.dart
│   │       └── register
│   │           ├── cubit
│   │           │   ├── cubit.dart
│   │           │   ├── register_cubit.dart
│   │           │   └── register_state.dart
│   │           ├── register.dart
│   │           └── register_page.dart
│   ├── features.dart
│   ├── general
│   │   ├── general.dart
│   │   └── presentation
│   │       ├── main
│   │       │   ├── main.dart
│   │       │   ├── main_page.dart
│   │       │   └── menu_drawer.dart
│   │       ├── presentation.dart
│   │       ├── settings
│   │       │   ├── cubit
│   │       │   │   ├── cubit.dart
│   │       │   │   └── settings_cubit.dart
│   │       │   ├── settings.dart
│   │       │   └── settings_page.dart
│   │       └── splashscreen
│   │           ├── splash_screen_page.dart
│   │           └── splashscreen.dart
│   └── users
│       ├── data
│       │   ├── data.dart
│       │   ├── datasources
│       │   │   ├── datasources.dart
│       │   │   └── user_remote_datasources.dart
│       │   ├── models
│       │   │   ├── models.dart
│       │   │   └── users_response.dart
│       │   └── repositories
│       │       ├── repositories.dart
│       │       └── users_repository_impl.dart
│       ├── domain
│       │   ├── domain.dart
│       │   ├── entities
│       │   │   ├── entities.dart
│       │   │   └── users.dart
│       │   ├── repositories
│       │   │   ├── repositories.dart
│       │   │   └── users_repository.dart
│       │   └── usecases
│       │       ├── get_users.dart
│       │       └── usecases.dart
│       ├── presentation
│       │   ├── dashboard
│       │   │   ├── cubit
│       │   │   │   ├── cubit.dart
│       │   │   │   ├── users_cubit.dart
│       │   │   │   └── users_state.dart
│       │   │   ├── dashboard.dart
│       │   │   ├── dashboard_page.dart
│       │   │   └── dashboard_success.dart
│       │   └── presentation.dart
│       └── users.dart
├── main_prd.dart
├── main_stg.dart
├── my_app.dart
└── utils
    ├── ext
    │   ├── context.dart
    │   ├── ext.dart
    │   └── string.dart
    ├── helper
    │   ├── common.dart
    │   ├── constant.dart
    │   ├── data_helper.dart
    │   ├── go_router_refresh_stream.dart
    │   ├── helper.dart
    │   └── pref_manager.dart
    ├── services
    │   ├── firebase_services.dart
    │   └── services.dart
    └── utils.dart

Test Project Structure


test/
├── features
│   ├── auth
│   │   ├── data
│   │   │   ├── datasources
│   │   │   │   ├── models
│   │   │   │   │   ├── login_response_test.dart
│   │   │   │   │   └── register_response_test.dart
│   │   │   │   └── repositories
│   │   │   │       └── auth_remote_datasources_test.dart
│   │   │   └── repositories
│   │   │       └── auth_repository_impl_test.dart
│   │   ├── domain
│   │   │   └── usecases
│   │   │       ├── post_login_test.dart
│   │   │       └── post_register_test.dart
│   │   └── presentation
│   │       ├── login
│   │       │   ├── cubit
│   │       │   │   ├── auth_cubit_test.dart
│   │       │   │   ├── auth_cubit_test.mocks.dart
│   │       │   │   └── auth_state_test.dart
│   │       │   └── login_page_test.dart
│   │       └── register
│   │           ├── cubit
│   │           │   ├── register_cubit_test.dart
│   │           │   ├── register_cubit_test.mocks.dart
│   │           │   └── register_state_test.dart
│   │           └── register_page_test.dart
│   ├── general
│   │   └── presentation
│   │       └── settings
│   │           ├── cubit
│   │           │   └── settings_cubit_test.dart
│   │           └── settings_page_test.dart
│   └── users
│       ├── data
│       │   ├── datasources
│       │   │   ├── models
│       │   │   │   └── users_response_test.dart
│       │   │   └── repositories
│       │   │       └── users_remote_datasources_test.dart
│       │   └── repositories
│       │       └── users_repository_impl_test.dart
│       ├── domain
│       │   └── usecases
│       │       └── get_users_test.dart
│       └── presentation
│           └── dashboard
│               ├── cubit
│               │   ├── users_cubit_test.dart
│               │   ├── users_cubit_test.mocks.dart
│               │   └── users_state_test.dart
│               └── dashboard_page_test.dart
└── helpers
    ├── data_dummy
    │   ├── list_user_empty_response.json
    │   ├── list_user_response.json
    │   ├── login_success_response.json
    │   ├── login_unsuccessful_response.json
    │   ├── register_success_response.json
    │   └── register_unsuccessful_response.json
    ├── json_reader.dart
    ├── paths.dart
    ├── test_mock.dart
    └── test_mock.mocks.dart



Buy me coffee if you love my works ☕️

buymeacoffe      ko-fi      paypal



About

Flutter auth app with TDD Clean Architecture

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Dart 99.5%
  • Other 0.5%