In this project, we are going to build a user management app using Flutter. We have used the Go REST API to make HTTP request methods. This API provides all sorts of methods that we need: GET, POST, PUT, and DELETE. We will call all endpoints (users/todos/posts/comments) provided to us by the Go REST API using the Dio package in our app. We have performed different operations like selecting, adding, editing, and removing users, as well as user posts, todos, and comments.
User screen | Create-update User | Todo screen | Post screen |
---|---|---|---|
Date picker | Time picker | Create-update post | Comment Screen |
---|---|---|---|
Error state | Empty state | Warning dialog | Progress dialog |
---|---|---|---|
-
Different implementations with separate modules based on state management solutions and software architectures
-
Clean architecture / MVVM architecture / simple layered architecture
-
Feature-first and Layer-first approach
-
Performing CRUD operation using
Dio
and go rest api -
Converting JSON string to an equivalent dart object and vice versa with
json serializable
-
Implementing Interceptors, Global configuration and timeout for api calls
-
Exception Handling with Dio interceptor,
Dartz
andfreezed
-
Dependency injection with
get it
(Clean architecture / MVVM architecture version) -
Displaying error type to the user through the alert dialogs
-
Colorize api info like request, response, body and exceptions in Debug console log
-
Read, create, update and delete user
-
Filter users by status activity or gender
-
Read, create, update and delete user todos
-
Filter todos by status
-
Read, create, update and delete user posts
-
Display, create and delete user comments for each post
-
Get date/time from user by Date/Time picker
-
Generic structure
-
State management with
GetX
|Bloc
|Cubit
|RxDart
-
Unit testing (Clean architecture version (GetX))
In this repository two architectural approaches have been used. Feature-first (for clean architecture and simple layered architecture version) and Layer-first (for mvvm architecture version).
The feature-first approach demands that we create a new folder for every new feature that we add to our app. And inside that, we add the layers themselves as sub-folders. But in Layer-first approach, we add all the relevant files inside each feature folder, ensuring that they belong to the correct layer.
β’ The user endpoint contains ten user objects by default. If any of them are deleted, they will be replaced with a new JSON object. This means that the length of the user list will always be ten, and it is not possible to create more than ten user objects. This also applies if you want to add query parameters to the users.
β’ To use the request methods PUT, POST, PATCH, and DELETE, you need to provide an access token. This token must be passed with the "Authorization" header as a Bearer token. I have already included my own token in the app. However, if you receive an Unauthorized Error (401), please go to this link to obtain a new token and replace the old token in the api_config file located in the core directory.
β’ Please note that the data is not permanent and will be changed or deleted every 20 minutes to 1 hour.
Version | Bloc | Cubit | Getx | RxDart + Provider |
---|---|---|---|---|
Clean architecture version | SourceοΈ | Source | Source | Source |
MVVM architecture version | Source | SourceοΈ | SourceοΈ | |
Simple layered architecture version | Source | Source | Source |
Name | GetX | Cubit | Bloc | RxDart + Provider |
---|---|---|---|---|
flutter_bloc | βοΈ | β | β | β |
provider | βοΈ | β | β | β |
rxdart | βοΈ | β | β | β |
get_it | βοΈ | β | β | β |
GetX | βοΈ | βοΈ | βοΈ | β |
dio | βοΈ | βοΈ | βοΈ | β |
freezed | βοΈ | βοΈ | βοΈ | β |
freezed_annotation | β | βοΈ | βοΈ | β |
json_annotation | βοΈ | βοΈ | βοΈ | β |
json_serializable | βοΈ | βοΈ | βοΈ | β |
build_runner | βοΈ | βοΈ | βοΈ | β |
logger | βοΈ | βοΈ | βοΈ | β |
dartz | βοΈ | βοΈ | βοΈ | β |
flutter_spinkit | βοΈ | βοΈ | βοΈ | β |
intl | βοΈ | βοΈ | βοΈ | β |
mockito | βοΈ | βοΈ | βοΈ | β |
Name | GetX | Cubit | Bloc |
---|---|---|---|
flutter_bloc | βοΈ | β | β |
get_it | βοΈ | β | β |
GetX | βοΈ | βοΈ | βοΈ |
dio | βοΈ | βοΈ | βοΈ |
freezed | βοΈ | βοΈ | βοΈ |
freezed_annotation | β | βοΈ | βοΈ |
json_annotation | βοΈ | βοΈ | βοΈ |
json_serializable | βοΈ | βοΈ | βοΈ |
build_runner | βοΈ | βοΈ | βοΈ |
logger | βοΈ | βοΈ | βοΈ |
dartz | βοΈ | βοΈ | βοΈ |
flutter_spinkit | βοΈ | βοΈ | βοΈ |
intl | βοΈ | βοΈ | βοΈ |
Name | GetX | Cubit | Bloc |
---|---|---|---|
flutter_bloc | βοΈ | β | β |
GetX | βοΈ | βοΈ | βοΈ |
dio | βοΈ | βοΈ | βοΈ |
freezed | βοΈ | βοΈ | βοΈ |
freezed_annotation | β | βοΈ | βοΈ |
json_annotation | βοΈ | βοΈ | βοΈ |
json_serializable | βοΈ | βοΈ | βοΈ |
build_runner | βοΈ | βοΈ | βοΈ |
logger | βοΈ | βοΈ | βοΈ |
dartz | βοΈ | βοΈ | βοΈ |
flutter_spinkit | βοΈ | βοΈ | βοΈ |
intl | βοΈ | βοΈ | βοΈ |
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπbloc
β β βββbloc_helper.dart
β β βββgeneric_bloc_state.dart
β β βββgeneric_bloc_builder.dart
β ββββπusecase
β β βββusecase.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_config.dart
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπfeatures
ββββπuser
β ββββπdata
β β βββπdatasources
β β β βββuser_remote_data_source.dart
β β βββπmodels
β β β βββuser.dart
β β β βββuser.g.dart
β β βββπrepositories
β β βββuser_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββuser_entity.dart
β β ββββπrepositories
β β β βββuser_repository.dart
β β ββββπusecases
β β β βββcreate_user_usecase.dart
β β β βββdelete_user_usecase.dart
β β β βββget_users_usecase.dart
β β β βββupdate_user_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββuser_bloc.dart
β β βββuser_event.dart
β ββββπscreens
β β βββuser_list_screen.dart
β ββββπwidgets
β βββstatus_container.dart
β
ββββπtodo
β ββββπdata
β β βββπdatasources
β β β βββtodo_remote_data_source.dart
β β βββπmodels
β β β βββtodo.dart
β β β βββtodo.g.dart
β β βββπrepositories
β β βββtodo_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββtodo_entity.dart
β β ββββπrepositories
β β β βββtodo_repository.dart
β β ββββπusecases
β β β βββcreate_todo_usecase.dart
β β β βββdelete_todo_usecase.dart
β β β βββget_todos_usecase.dart
β β β βββupdate_todo_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββtodo_bloc.dart
β β βββtodo_event.dart
β ββββπscreens
β β βββtodo_list_screen.dart
β ββββπwidgets
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπpost
β ββββπdata
β β βββπdatasources
β β β βββpost_remote_data_source.dart
β β βββπmodels
β β β βββpost.dart
β β β βββpost.g.dart
β β βββπrepositories
β β βββpost_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββpost_entity.dart
β β ββββπrepositories
β β β βββpost_repository.dart
β β ββββπusecases
β β β βββcreate_post_usecase.dart
β β β βββdelete_post_usecase.dart
β β β βββget_posts_usecase.dart
β β β βββupdate_post_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββpost_bloc.dart
β β βββpost_event.dart
β ββββπscreens
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπcomment
ββββπdata
β βββπdatasources
β β βββcomment_remote_data_source.dart
β βββπmodels
β β βββcomment.dart
β β βββcomment.g.dart
β βββπrepositories
β βββcomment_repository_impl.dart
ββββπdomain
β ββββπentities
β β βββcomment_entity.dart
β ββββπrepositories
β β βββcomment_repository.dart
β ββββπusecases
β β βββcreate_comment_usecase.dart
β β βββdelete_comment_usecase.dart
β β βββget_comments_usecase.dart
βββ πpresentation
ββββπbloc
βββcomment_bloc.dart
βββcomment_event.dart
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπcubit
β β βββgeneric_cubit.dart
β β βββgeneric_cubit_state.dart
β ββββπusecase
β β βββusecase.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_config.dart
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπfeatures
ββββπuser
β ββββπdata
β β βββπdatasources
β β β βββuser_remote_data_source.dart
β β βββπmodels
β β β βββuser.dart
β β β βββuser.g.dart
β β βββπrepositories
β β βββuser_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββuser_entity.dart
β β ββββπrepositories
β β β βββuser_repository.dart
β β ββββπusecases
β β β βββcreate_user_usecase.dart
β β β βββdelete_user_usecase.dart
β β β βββget_users_usecase.dart
β β β βββupdate_user_usecase.dart
β βββ πpresentation
β ββββπcubit
β β βββuser_cubit.dart
β ββββπscreens
β β βββuser_list_screen.dart
β ββββπwidgets
β βββstatus_container.dart
β
ββββπtodo
β ββββπdata
β β βββπdatasources
β β β βββtodo_remote_data_source.dart
β β βββπmodels
β β β βββtodo.dart
β β β βββtodo.g.dart
β β βββπrepositories
β β βββtodo_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββtodo_entity.dart
β β ββββπrepositories
β β β βββtodo_repository.dart
β β ββββπusecases
β β β βββcreate_todo_usecase.dart
β β β βββdelete_todo_usecase.dart
β β β βββget_todos_usecase.dart
β β β βββupdate_todo_usecase.dart
β βββ πpresentation
β ββββπcubit
β β βββtodo_cubit.dart
β ββββπscreens
β β βββtodo_list_screen.dart
β ββββπwidgets
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπpost
β ββββπdata
β β βββπdatasources
β β β βββpost_remote_data_source.dart
β β βββπmodels
β β β βββpost.dart
β β β βββpost.g.dart
β β βββπrepositories
β β βββpost_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββpost_entity.dart
β β ββββπrepositories
β β β βββpost_repository.dart
β β ββββπusecases
β β β βββcreate_post_usecase.dart
β β β βββdelete_post_usecase.dart
β β β βββget_posts_usecase.dart
β β β βββupdate_post_usecase.dart
β βββ πpresentation
β ββββπcubit
β β βββpost_cubit.dart
β ββββπscreens
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπcomment
ββββπdata
β βββπdatasources
β β βββcomment_remote_data_source.dart
β βββπmodels
β β βββcomment.dart
β β βββcomment.g.dart
β βββπrepositories
β βββcomment_repository_impl.dart
ββββπdomain
β ββββπentities
β β βββcomment_entity.dart
β ββββπrepositories
β β βββcomment_repository.dart
β ββββπusecases
β β βββcreate_comment_usecase.dart
β β βββdelete_comment_usecase.dart
β β βββget_comments_usecase.dart
βββ πpresentation
ββββπcubit
βββcomment_cubit.dart
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπbloc
β β βββgeneric_bloc_state.dart
β ββββπusecase
β β βββusecase.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_config.dart
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπfeatures
ββββπuser
β ββββπdata
β β βββπdatasources
β β β βββuser_remote_data_source.dart
β β βββπmodels
β β β βββuser.dart
β β β βββuser.g.dart
β β βββπrepositories
β β βββuser_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββuser_entity.dart
β β ββββπrepositories
β β β βββuser_repository.dart
β β ββββπusecases
β β β βββcreate_user_usecase.dart
β β β βββdelete_user_usecase.dart
β β β βββget_users_usecase.dart
β β β βββupdate_user_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββuser_bloc.dart
β β βββuser_event.dart
β ββββπscreens
β β βββuser_list_screen.dart
β ββββπwidgets
β βββstatus_container.dart
β
ββββπtodo
β ββββπdata
β β βββπdatasources
β β β βββtodo_remote_data_source.dart
β β βββπmodels
β β β βββtodo.dart
β β β βββtodo.g.dart
β β βββπrepositories
β β βββtodo_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββtodo_entity.dart
β β ββββπrepositories
β β β βββtodo_repository.dart
β β ββββπusecases
β β β βββcreate_todo_usecase.dart
β β β βββdelete_todo_usecase.dart
β β β βββget_todos_usecase.dart
β β β βββupdate_todo_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββtodo_bloc.dart
β β βββtodo_event.dart
β ββββπscreens
β β βββtodo_list_screen.dart
β ββββπwidgets
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπpost
β ββββπdata
β β βββπdatasources
β β β βββpost_remote_data_source.dart
β β βββπmodels
β β β βββpost.dart
β β β βββpost.g.dart
β β βββπrepositories
β β βββpost_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββpost_entity.dart
β β ββββπrepositories
β β β βββpost_repository.dart
β β ββββπusecases
β β β βββcreate_post_usecase.dart
β β β βββdelete_post_usecase.dart
β β β βββget_posts_usecase.dart
β β β βββupdate_post_usecase.dart
β βββ πpresentation
β ββββπbloc
β β βββpost_bloc.dart
β ββββπscreens
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπcomment
ββββπdata
β βββπdatasources
β β βββcomment_remote_data_source.dart
β βββπmodels
β β βββcomment.dart
β β βββcomment.g.dart
β βββπrepositories
β βββcomment_repository_impl.dart
ββββπdomain
β ββββπentities
β β βββcomment_entity.dart
β ββββπrepositories
β β βββcomment_repository.dart
β ββββπusecases
β β βββcreate_comment_usecase.dart
β β βββdelete_comment_usecase.dart
β β βββget_comments_usecase.dart
βββ πpresentation
ββββπbloc
βββcomment_bloc.dart
root
βββ πcoverage
βββ πlib
β ββββmain.dart
β ββββdi.dart
β ββββπcommon
β β ββββπcontroller
β β β βββbase_controller.dart
β β ββββπusecase
β β β βββusecase.dart
β β ββββπrepository
β β β βββrepository_helper.dart
β β ββββπnetwork
β β β βββapi_config.dart
β β β βββapi_base.dart
β β β βββdio_client.dart
β β β βββdio_exception.dart
β β β βββdio_interceptor.dart
β β ββββπwidget
β β β βββdate_time_picker.dart
β β β βββdrop_down.dart
β β β βββempty_widget.dart
β β β βββpopup_menu.dart
β β β βββspinkit_indicator.dart
β β β βββtext_input.dart
β β ββββπdialog
β β βββcreate_dialog.dart
β β βββdelete_dialog.dart
β β βββprogress_dialog.dart
β β βββretry_dialog.dart
β ββββπcore
β β βββapp_asset.dart
β β βββapp_extension.dart
β β βββapp_string.dart
β β βββapp_style.dart
β β βββapp_theme.dart
β β
β ββββπfeatures
β ββββπuser
β β ββββπdata
β β β βββπdatasources
β β β β βββuser_remote_data_source.dart
β β β βββπmodels
β β β β βββuser.dart
β β β β βββuser.g.dart
β β β βββπrepositories
β β β βββuser_repository_impl.dart
β β ββββπdomain
β β β ββββπentities
β β β β βββuser_entity.dart
β β β ββββπrepositories
β β β β βββuser_repository.dart
β β β ββββπusecases
β β β β βββcreate_user_usecase.dart
β β β β βββdelete_user_usecase.dart
β β β β βββget_users_usecase.dart
β β β β βββupdate_user_usecase.dart
β β βββ πpresentation
β β ββββπcontroller
β β β βββuser_controller.dart
β β ββββπscreens
β β β βββuser_list_screen.dart
β β ββββπwidgets
β β βββstatus_container.dart
β β
β ββββπtodo
β β ββββπdata
β β β βββπdatasources
β β β β βββtodo_remote_data_source.dart
β β β βββπmodels
β β β β βββtodo.dart
β β β β βββtodo.g.dart
β β β βββπrepositories
β β β βββtodo_repository_impl.dart
β β ββββπdomain
β β β ββββπentities
β β β β βββtodo_entity.dart
β β β ββββπrepositories
β β β β βββtodo_repository.dart
β β β ββββπusecases
β β β β βββcreate_todo_usecase.dart
β β β β βββdelete_todo_usecase.dart
β β β β βββget_todos_usecase.dart
β β β β βββupdate_todo_usecase.dart
β β βββ πpresentation
β β ββββπcontroller
β β β βββtodo_controller.dart
β β ββββπscreens
β β β βββtodo_list_screen.dart
β β ββββπwidgets
β β βββcircle_container.dart
β β βββtodo_list_item.dart
β ββββπpost
β β ββββπdata
β β β βββπdatasources
β β β β βββpost_remote_data_source.dart
β β β βββπmodels
β β β β βββpost.dart
β β β β βββpost.g.dart
β β β βββπrepositories
β β β βββpost_repository_impl.dart
β β ββββπdomain
β β β ββββπentities
β β β β βββpost_entity.dart
β β β ββββπrepositories
β β β β βββpost_repository.dart
β β β ββββπusecases
β β β β βββcreate_post_usecase.dart
β β β β βββdelete_post_usecase.dart
β β β β βββget_posts_usecase.dart
β β β β βββupdate_post_usecase.dart
β β βββ πpresentation
β β ββββπcontroller
β β β βββpost_controller.dart
β β ββββπscreens
β β βββcreate_post_screen.dart
β β βββpost_detail_screen.dart
β β βββpost_list_screen.dart
β ββββπcomment
β ββββπdata
β β βββπdatasources
β β β βββcomment_remote_data_source.dart
β β βββπmodels
β β β βββcomment.dart
β β β βββcomment.g.dart
β β βββπrepositories
β β βββcomment_repository_impl.dart
β ββββπdomain
β β ββββπentities
β β β βββcomment_entity.dart
β β ββββπrepositories
β β β βββcomment_repository.dart
β β ββββπusecases
β β β βββcreate_comment_usecase.dart
β β β βββdelete_comment_usecase.dart
β β β βββget_comments_usecase.dart
β βββ πpresentation
β ββββπcontroller
β βββcomment_controller.dart
β
β
β
βββ πtest
βββπtest_utils
β ββββ πdata
β ββββtest_data.dart
βββπcommon
β ββββ πnetwork
β β ββββdio_exception_test.dart
β ββββ πrepository
β ββββrepository_helper_test.dart
βββπcore
β ββββapp_extension_test.dart
β
βββπfeatures
ββββπuser
β ββββπdata
β β βββπdatasources
β β β βββuser_remote_data_source_test.dart
β β β βββuser_remote_data_source_test.mocks.dart
β β βββπrepositories
β β βββuser_repository_impl_test.dart
β β βββuser_repository_impl_test.mocks.dart
β ββββπdomain
β β ββββπusecases
β β β βββcreate_user_usecase_test.dart
β β β βββcreate_user_usecase_test.mocks.dart
β β β βββdelete_user_usecase_test.dart
β β β βββget_users_usecase_test.dart
β β β βββupdate_user_usecase_test.dart
β βββ πpresentation
β ββββπcontroller
β βββuser_controller_test.dart
β βββuser_controller_test.mocks.dart
β
ββββπtodo
β ββββπdata
β β βββπdatasources
β β β βββtodo_remote_data_source_test.dart
β β β βββtodo_remote_data_source_test.mocks.dart
β β βββπrepositories
β β βββtodo_repository_impl_test.dart
β β βββtodo_repository_impl_test.mocks.dart
β ββββπdomain
β β ββββπusecases
β β β βββcreate_todo_usecase_test.dart
β β β βββcreate_todo_usecase_test.mocks.dart
β β β βββdelete_todo_usecase_test.dart
β β β βββget_todos_usecase_test.dart
β β β βββupdate_todo_usecase_test.dart
β βββ πpresentation
β ββββπcontroller
β βββtodo_controller_test.dart
β βββtodo_controller_test.mocks.dart
ββββπpost
β ββββπdata
β β βββπdatasources
β β β βββpost_remote_data_source_test.dart
β β β βββpost_remote_data_source_test.mocks.dart
β β βββπrepositories
β β βββpost_repository_impl_test.dart
β β βββpost_repository_impl_test.mocks.dart
β ββββπdomain
β β ββββπusecases
β β β βββcreate_post_usecase_test.dart
β β β βββcreate_post_usecase_test.mocks.dart
β β β βββdelete_post_usecase_test.dart
β β β βββget_posts_usecase_test.dart
β β β βββupdate_post_usecase_test.dart
β βββ πpresentation
β ββββπcontroller
β βββpost_controller_test.dart
β βββpost_controller_test.mocks.dart
ββββπcomment
ββββπdata
β βββπdatasources
β β βββcomment_remote_data_source_test.dart
β β βββcomment_remote_data_source_test.mocks.dart
β βββπrepositories
β βββcomment_repository_impl_test.dart
β βββcomment_repository_impl_test.mocks.dart
ββββπdomain
β ββββπusecases
β β βββcreate_comment_usecase_test.dart
β β βββcreate_comment_usecase.mocks.dart
β β βββdelete_comment_usecase_test.dart
β β βββget_comments_usecase_test.dart
βββ πpresentation
ββββπcontroller
βββcomment_controller_test.dart
βββcomment_controller_test.mocks.dart
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπbloc
β β βββbloc_helper.dart
β β βββgeneric_bloc_state.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπdata
β ββββπapi
β β ββββπcomment
β β β βββcomment_api.dart
β β ββββπpost
β β β βββpost_api.dart
β β ββββπtodo
β β β βββtodo_api.dart
β β ββββπuser
β β βββuser_api.dart
β β
β ββββπmodel
β ββββπcomment
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπpost
β β βββpost.dart
β β βββpost.g.dart
β ββββπtodo
β β βββtodo.dart
β β βββtodo.g.dart
β ββββπuser
β βββuser.dart
β βββuser.g.dart
β
ββββπrepository
β ββββπcomment
β β βββcomment_repository.dart
β ββββπpost
β β βββpost_repository.dart
β ββββπtodo
β β βββtodo_repository.dart
β ββββπuser
β βββuser_repository.dart
β
ββββπview
β ββββπpost
β β βββπscreen
β β βββcreate_post_screen.dart
β β βββpost_detail_screen.dart
β β βββpost_list_screen.dart
β β
β ββββπtodo
β β βββπscreen
β β β βββtodo_list_screen.dart
β β βββπwidget
β β βββcircle_container.dart
β β βββtodo_list_item.dart
β β
β ββββπuser
β βββπscreen
β β βββuser_list_screen.dart
β βββπwidget
β βββstatus_container.dart
β
ββββπviewmodel
ββββπcomment
β βββπbloc
β βββcomment_bloc.dart
β βββcomment_event.dart
ββββπpost
β βββπbloc
β βββpost_bloc.dart
β βββpost_event.dart
ββββπtodo
β βββπbloc
β βββtodo_bloc.dart
β βββtodo_event.dart
ββββπuser
βββπbloc
βββuser_bloc.dart
βββuser_event.dart
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπcubit
β β βββgeneric_cubit.dart
β β βββgeneric_cubit_state.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπdata
β ββββπapi
β β ββββπcomment
β β β βββcomment_api.dart
β β ββββπpost
β β β βββpost_api.dart
β β ββββπtodo
β β β βββtodo_api.dart
β β ββββπuser
β β βββuser_api.dart
β β
β ββββπmodel
β ββββπcomment
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπpost
β β βββpost.dart
β β βββpost.g.dart
β ββββπtodo
β β βββtodo.dart
β β βββtodo.g.dart
β ββββπuser
β βββuser.dart
β βββuser.g.dart
β
ββββπrepository
β ββββπcomment
β β βββcomment_repository.dart
β ββββπpost
β β βββpost_repository.dart
β ββββπtodo
β β βββtodo_repository.dart
β ββββπuser
β βββuser_repository.dart
β
ββββπview
β ββββπpost
β β βββπscreen
β β βββcreate_post_screen.dart
β β βββpost_detail_screen.dart
β β βββpost_list_screen.dart
β β
β ββββπtodo
β β βββπscreen
β β β βββtodo_list_screen.dart
β β βββπwidget
β β βββcircle_container.dart
β β βββtodo_list_item.dart
β β
β ββββπuser
β βββπscreen
β β βββuser_list_screen.dart
β βββπwidget
β βββstatus_container.dart
β
ββββπviewmodel
ββββπcomment
β βββπcubit
β βββcomment_cubit.dart
ββββπpost
β βββπcubit
β βββpost_cubit.dart
ββββπtodo
β βββπcubit
β βββtodo_cubit.dart
ββββπuser
βββπcubit
βββuser_cubit.dart
πlib
ββββmain.dart
ββββdi.dart
ββββπcommon
β ββββπcontroller
β β βββbase_controller.dart
β ββββπrepository
β β βββrepository_helper.dart
β ββββπnetwork
β β βββapi_helper.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
β
ββββπdata
β ββββπapi
β β ββββπcomment
β β β βββcomment_api.dart
β β ββββπpost
β β β βββpost_api.dart
β β ββββπtodo
β β β βββtodo_api.dart
β β ββββπuser
β β βββuser_api.dart
β β
β ββββπmodel
β ββββπcomment
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπpost
β β βββpost.dart
β β βββpost.g.dart
β ββββπtodo
β β βββtodo.dart
β β βββtodo.g.dart
β ββββπuser
β βββuser.dart
β βββuser.g.dart
β
ββββπrepository
β ββββπcomment
β β βββcomment_repository.dart
β ββββπpost
β β βββpost_repository.dart
β ββββπtodo
β β βββtodo_repository.dart
β ββββπuser
β βββuser_repository.dart
β
ββββπview
β ββββπpost
β β βββπscreen
β β βββcreate_post_screen.dart
β β βββpost_detail_screen.dart
β β βββpost_list_screen.dart
β β
β ββββπtodo
β β βββπscreen
β β β βββtodo_list_screen.dart
β β βββπwidget
β β βββcircle_container.dart
β β βββtodo_list_item.dart
β β
β ββββπuser
β βββπscreen
β β βββuser_list_screen.dart
β βββπwidget
β βββstatus_container.dart
β
ββββπviewmodel
ββββπcomment
β βββπcontroller
β βββcomment_controller.dart
ββββπpost
β βββπcontroller
β βββpost_controller.dart
ββββπtodo
β βββπcontroller
β βββtodo_controller.dart
ββββπuser
βββπcontroller
βββuser_controller.dart
πlib
ββββmain.dart
ββββπcommon
β ββββπcubit
β β βββgeneric_cubit.dart
β β βββgeneric_cubit_state.dart
β ββββπnetwork
β β βββapi_base.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
ββββπfeatures
ββββπcomment
β ββββπcubit
β β βββcomment_cubit.dart
β ββββπdata
β ββββπmodel
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπprovider
β βββπremote
β βββcomment_api.dart
ββββπpost
β ββββπcubit
β β βββpost_cubit.dart
β ββββπdata
β β ββββπmodel
β β β βββpost.dart
β β β βββpost.g.dart
β β ββββπprovider
β β βββπremote
β β βββpsot_api.dart
β ββββπview
β βββπscreen
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπtodo
β ββββπcubit
β β βββtodo_cubit.dart
β ββββπdata
β β ββββπmodel
β β β βββtodo.dart
β β β βββtodo.g.dart
β β ββββπprovider
β β βββπremote
β β βββtodo_api.dart
β ββββπview
β βββπscreen
β β βββtodo_list_screen.dart
β βββπwidget
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπuser
ββββπcubit
β βββuser_cubit.dart
ββββπdata
β ββββπmodel
β β βββuser.dart
β β βββuser.g.dart
β ββββπprovider
β βββπremote
β βββuser_api.dart
ββββπview
βββπscreen
β βββuser_list_screen.dart
βββπwidget
βββstatus_container.dart
πlib
ββββmain.dart
ββββπcommon
β ββββπbloc
β β βββbloc_helper.dart
β β βββgeneric_bloc_state.dart
β ββββπnetwork
β β βββapi_base.dart
β β βββapi_result.dart
β β βββapi_result.freezed.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
ββββπfeatures
ββββπcomment
β ββββπbloc
β β βββcomment_bloc.dart
β β βββcomment_event.dart
β ββββπdata
β ββββπmodel
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπprovider
β βββπremote
β βββcomment_api.dart
ββββπpost
β ββββπbloc
β β βββpost_bloc.dart
β β βββpost_event.dart
β ββββπdata
β β ββββπmodel
β β β βββpost.dart
β β β βββpost.g.dart
β β ββββπprovider
β β βββπremote
β β βββpsot_api.dart
β ββββπview
β βββπscreen
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπtodo
β ββββπbloc
β β βββtodo_bloc.dart
β β βββtodo_event.dart
β ββββπdata
β β ββββπmodel
β β β βββtodo.dart
β β β βββtodo.g.dart
β β ββββπprovider
β β βββπremote
β β βββtodo_api.dart
β ββββπview
β βββπscreen
β β βββtodo_list_screen.dart
β βββπwidget
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπuser
ββββπbloc
β βββuser_bloc.dart
β βββuser_event.dart
ββββπdata
β ββββπmodel
β β βββuser.dart
β β βββuser.g.dart
β ββββπprovider
β βββπremote
β βββuser_api.dart
ββββπview
βββπscreen
β βββuser_list_screen.dart
βββπwidget
βββstatus_container.dart
πlib
ββββmain.dart
ββββπcommon
β ββββπcontroller
β β βββbase_controller.dart
β ββββπnetwork
β β βββapi_base.dart
β β βββdio_client.dart
β β βββdio_exception.dart
β β βββdio_interceptor.dart
β ββββπwidget
β β βββasync_widget.dart
β β βββdate_time_picker.dart
β β βββdrop_down.dart
β β βββempty_widget.dart
β β βββpopup_menu.dart
β β βββspinkit_indicator.dart
β β βββtext_input.dart
β ββββπdialog
β βββcreate_dialog.dart
β βββdelete_dialog.dart
β βββprogress_dialog.dart
β βββretry_dialog.dart
ββββπcore
β βββapi_config.dart
β βββapp_asset.dart
β βββapp_extension.dart
β βββapp_string.dart
β βββapp_style.dart
β βββapp_theme.dart
ββββπfeatures
ββββπcomment
β ββββπcontroller
β β βββcomment_controller.dart
β ββββπdata
β ββββπmodel
β β βββcomment.dart
β β βββcomment.g.dart
β ββββπprovider
β βββπremote
β βββcomment_api.dart
ββββπpost
β ββββπcontroller
β β βββpost_controller.dart
β ββββπdata
β β ββββπmodel
β β β βββpost.dart
β β β βββpost.g.dart
β β ββββπprovider
β β βββπremote
β β βββpsot_api.dart
β ββββπview
β βββπscreen
β βββcreate_post_screen.dart
β βββpost_detail_screen.dart
β βββpost_list_screen.dart
ββββπtodo
β ββββπcontroller
β β βββtodo_controller.dart
β ββββπdata
β β ββββπmodel
β β β βββtodo.dart
β β β βββtodo.g.dart
β β ββββπprovider
β β βββπremote
β β βββtodo_api.dart
β ββββπview
β βββπscreen
β β βββtodo_list_screen.dart
β βββπwidget
β βββcircle_container.dart
β βββtodo_list_item.dart
ββββπuser
ββββπcontroller
β βββuser_controller.dart
ββββπdata
β ββββπmodel
β β βββuser.dart
β β βββuser.g.dart
β ββββπprovider
β βββπremote
β βββuser_api.dart
ββββπview
βββπscreen
β βββuser_list_screen.dart
βββπwidget
βββstatus_container.dart
Project Name | Stars |
---|---|
Japanese restaurant app | |
Office furniture store app | |
Ecommerce app |