GetX + GetX Pattern
GetX: https://github.com/jonataslaw/getx
getx_pattern: https://github.com/kauemurakami/getx_pattern
/lib
폴더 구조lib
├── binding 각 스크린별 필요한 의존성 주입
├── controller 상태관리
├── model 데이터 타입 정의
├── provider 서버 api, 로컬 DB api 등 호출
├── repository 응답으로 받은 데이터 가공
├── src 상수값 정의
├── util 편의성 함수 정의
├── view 화면에 보이는 UI 모음
├── main.dart
├── router.dart 각 스크린별 라우팅 정의
└── test_screen.dart 새 컴포넌트 개발 시 테스트 스크린에서 하면 편하다 ^,^
= provider -> repository -> controller -> view
const sampleUrl = "http://ko.gravatar.com/beaua06344c126b.json";
class SampleApi extends GetConnect {
Future<Response> getSampleUserProfile() async {
return await get(sampleUrl);
}
}
abstract class AbstractSampleRepository {
Future<SampleUserModel> getSampleUserProfile();
}
class SampleReopsitory extends GetxService implements AbstractSampleRepository {
final SampleApi sampleApi;
SampleReopsitory({required this.sampleApi});
Future<SampleUserModel> getSampleUserProfile() async {
try {
Response res = await sampleApi.getSampleUserProfile();
return SampleUserModel.fromJson(res.body);
} catch (e) {
debugPrint("ERROR: $e");
rethrow;
}
}
}
private
처리public
처리class SampleController extends GetxController {
final SampleReopsitory sampleReopsitory;
SampleController({required this.sampleReopsitory});
final Rx<SampleUserModel?> _user = Rx<SampleUserModel?>(null);
final Rx<int> _buttonPressCount = 0.obs;
SampleUserModel? get user => _user.value;
int get buttonPressCount => _buttonPressCount.value;
Future<void> getProfileAndIncreaseCount() async {
await _getSampleUserProfile();
_increaseCount();
}
void resetCount() {
_buttonPressCount.value = 0;
}
void _increaseCount() {
_buttonPressCount.value += 1;
}
Future<void> _getSampleUserProfile() async {
_user.value = await sampleReopsitory.getSampleUserProfile();
}
}
view
폴더 구조view
├── common
│ ├── button
│ ├── layout
│ └── widgets.dart
├── sample
│ ├── screen
│ └── widget
├── home_screen.dart
└── screens.dart
common
: 공통 컴포넌트 위젯 모음signup
폴더에 first_signup_screen.dart
, second_signup_screen.dart
, ... 생성import
할 수 있게 screens.dart
파일 생성repository와 provider의 차이점을 자꾸 까먹어서 적어봤다. 폴더 구조가 늘 그렇듯 정해진 정답은 없지만 이렇게 작업했을 때 상당히 편했던 기억이 있다. (내가 처음부터 구축한건 아니고 사수님이 도입했었다. 이 글을 발견하셨나요,,?) 새 플러터 프로젝트를 시작하는 누군가에게 도움이 되면 좋겠다. 😇