<aside> ๐ก Code Architecture will be referred to Clean Architecture by Uncle Bob.
</aside>
It consists of four main modules: App
, Domain
, Data
, and Device
.
Nothing in an inner circle can know anything at all about something in an outer circle.
lib/
app/ <--- application layer
pages/ <-- pages or screens
sign_up/
views/
widgets/ <-- the entire widgets
login_0000.dart
sign_up_0111.dart
sign_up_0112.dart
controllers/
presenters/ <--- usecase์์ ๋ฐํ๋ ๊ฒฐ๊ณผ๋ฅผ
sign_up_details/
utils/ <--- ๋ ์ง, ๋ฐ์ดํฐ ์ฐ์ฐ ๋ฑ์ ๊ฐ๊ณต
navigator.dart
providers/ <--- ์ํ ๊ด๋ฆฌ Provider ๊ด๋ จ ๋ก์ง
data/
config/ <--- ๋ฐ์ดํฐ์ ๊ด๋ จ๋ ๋ชจ๋ ์ค์ ๊ฐ
dio.dart
path.dart
repositories/ <--- ๋ชจ๋ API ํธ์ถ
data_auth_repo.dart <-- example repo: handles all authentication
dto/ <--- ๋ฐ์ดํฐ ํ์ ์ ์
domain/ <--- domain layer (business and enterprise) PURE DART
entities/ <--- ๋น์ฆ๋์ค ๋ก์ง์ ํต์ฌ ๊ท์น, usecases์์ ์ฌ์ฉ
user.dart <-- example entity
manager.dart <-- example entity
usecases/ <--- ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ
user_usecase.dart <-- example usecase extends `UseCase` or `CompletableUseCase`
main.dart <--- entry point
์๋๋ ์ํฐํฐ๊ฐ ์ ์ฆ์ผ์ด์ค๋ฅผ ๊ฑฐ์ณ Presenter์ ์ํตํ๋ Flutter ์ฝ๋ ์์์ ๋๋ค.
class UserEntity {
final String name;
final String email;
UserEntity({required this.name, required this.email});
}
import 'package:my_app/entities/user_entity.dart';
class GetUserUseCase {
UserEntity getUserById(String userId) {
// ์ฌ๊ธฐ์๋ ๋จ์ํ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
return UserEntity(name: 'John Doe', email: '[email protected]');
}
}
import 'package:my_app/entities/user_entity.dart';
import 'package:my_app/use_cases/get_user_use_case.dart';
class UserPresenter {
final GetUserUseCase getUserUseCase;
UserPresenter({required this.getUserUseCase});
void getUserInfo(String userId) {
// ์ ์ฆ์ผ์ด์ค๋ฅผ ํตํด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
UserEntity user = getUserUseCase.getUserById(userId);
// ์ฌ์ฉ์ ์ ๋ณด๋ฅผ UI์ ํ์ํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
displayUserInfo(user);
}
void displayUserInfo(UserEntity user) {
// UI์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
print('User Name: ${user.name}, Email: ${user.email}');
}
}
์ ์ฝ๋์์๋ ์ํฐํฐ(UserEntity)๊ฐ ์ ์ฆ์ผ์ด์ค(GetUserUseCase)๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ๋ ์ ํฐ(UserPresenter)์๊ฒ ์ ๋ฌํฉ๋๋ค. ํ๋ ์ ํฐ๋ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ์ฌ UI์ ํ์ํ๋ ์ญํ ์ ํฉ๋๋ค.
์๋๋ Presenter์ Controller, ๊ทธ๋ฆฌ๊ณ View๊ฐ ์ด๋ป๊ฒ ์ํตํ๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ Dart ์ฝ๋ ์์์ ๋๋ค.