Flutter auth app with TDD Clean Architecture

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

Get Started ?

  • Clone this project
  • Run flutter run
  • Run Test flutter test

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

TODO ?

  • Integration Test
  • Implement multi flavor

Architecture Proposal by Resocoder

Project Structure

lib
 ├── core
 │   ├── 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
 │   └── usecase
 │       └── usecase.dart
 ├── data
 │   ├── data.dart
 │   ├── datasources
 │   │   ├── datasources.dart
 │   │   ├── local
 │   │   │   ├── data_helper.dart
 │   │   │   ├── local.dart
 │   │   │   └── pref_manager.dart
 │   │   └── remote
 │   │       ├── auth_remote_datasources.dart
 │   │       ├── model
 │   │       │   ├── auth
 │   │       │   │   ├── auth.dart
 │   │       │   │   ├── login_response.dart
 │   │       │   │   ├── register_response.dart
 │   │       │   │   └── users_response.dart
 │   │       │   └── model.dart
 │   │       ├── remote.dart
 │   │       └── services
 │   │           ├── dio_client.dart
 │   │           ├── dio_interceptor.dart
 │   │           ├── list_api.dart
 │   │           └── services.dart
 │   └── repositories
 │       ├── auth_repository_impl.dart
 │       └── repositories.dart
 ├── di
 │   └── di.dart
 ├── domain
 │   ├── domain.dart
 │   ├── entities
 │   │   ├── auth
 │   │   │   ├── auth.dart
 │   │   │   ├── login.dart
 │   │   │   ├── register.dart
 │   │   │   └── users.dart
 │   │   └── entities.dart
 │   ├── repositories
 │   │   ├── auth_repository.dart
 │   │   └── repositories.dart
 │   └── usecases
 │       ├── auth
 │       │   ├── auth.dart
 │       │   ├── get_users.dart
 │       │   ├── post_login.dart
 │       │   └── post_register.dart
 │       └── usecases.dart
 ├── main.dart
 ├── presentation
 │   ├── page
 │   │   ├── app_route.dart
 │   │   ├── auth
 │   │   │   ├── auth.dart
 │   │   │   ├── cubit
 │   │   │   │   ├── cubit.dart
 │   │   │   │   ├── login_cubit.dart
 │   │   │   │   ├── login_state.dart
 │   │   │   │   ├── register_cubit.dart
 │   │   │   │   └── register_state.dart
 │   │   │   ├── login_page.dart
 │   │   │   └── register_page.dart
 │   │   ├── main
 │   │   │   ├── cubit
 │   │   │   │   ├── cubit.dart
 │   │   │   │   └── navdrawer_cubit.dart
 │   │   │   ├── dashboard
 │   │   │   │   ├── cubit
 │   │   │   │   │   ├── cubit.dart
 │   │   │   │   │   ├── users_cubit.dart
 │   │   │   │   │   └── users_state.dart
 │   │   │   │   ├── dashboard.dart
 │   │   │   │   ├── dashboard_page.dart
 │   │   │   │   └── dashboard_success.dart
 │   │   │   ├── main.dart
 │   │   │   ├── main_page.dart
 │   │   │   ├── menu_drawer.dart
 │   │   │   └── settings
 │   │   │       ├── cubit
 │   │   │       │   ├── cubit.dart
 │   │   │       │   └── settings_cubit.dart
 │   │   │       ├── settings.dart
 │   │   │       └── settings_page.dart
 │   │   ├── pages.dart
 │   │   └── splashscreen
 │   │       └── splash_screen_page.dart
 │   ├── presentation.dart
 │   ├── resources
 │   │   ├── dimens.dart
 │   │   ├── images.dart
 │   │   ├── palette.dart
 │   │   ├── resources.dart
 │   │   └── styles.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
 └── utils
     ├── ext
     │   ├── context.dart
     │   ├── ext.dart
     │   └── string.dart
     ├── helper
     │   ├── common.dart
     │   ├── constant.dart
     │   └── helper.dart
     └── utils.dart

Test Project Structure

  test
    ├── data
    │   ├── datasources
    │   │   └── remote
    │   │       ├── auth_remote_datasources_test.dart
    │   │       └── model
    │   │           └── auth
    │   │               ├── login_response_test.dart
    │   │               ├── register_response_test.dart
    │   │               └── users_response_test.dart
    │   └── repositories
    │       └── auth_repository_impl_test.dart
    ├── domain
    │   └── usecases
    │       └── auth
    │           ├── get_users_test.dart
    │           ├── post_login_test.dart
    │           └── post_register_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
    └── presentation
        └── page
            ├── auth
            │   ├── cubit
            │   │   ├── login_cubit_test.dart
            │   │   ├── login_cubit_test.mocks.dart
            │   │   ├── login_state_test.dart
            │   │   ├── register_cubit_test.dart
            │   │   ├── register_cubit_test.mocks.dart
            │   │   └── register_state_test.dart
            │   ├── login_page_test.dart
            │   └── register_page_test.dart
            └── main
                ├── cubit
                │   └── navdrawer_cubit_test.dart
                ├── dashboard
                │   ├── cubit
                │   │   ├── users_cubit_test.dart
                │   │   ├── users_cubit_test.mocks.dart
                │   │   └── users_state_test.dart
                │   └── dashboard_page_test.dart
                └── settings
                    ├── cubit
                    │   └── settings_cubit_test.dart
                    └── settings_page_test.dart

Buy me coffee if you love my works ☕️

         

GitHub

View Github