Skip to content

MoblieOpenSource/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

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
  • Autofill Username and Password

TODO πŸ“

  • Integration Test
  • Implement multi flavor

Architecture Proposal by Resocoder


architecture-proposal

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 β˜•οΈ

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 98.9%
  • Other 1.1%