= Flutter = * https://flutter.dev * https://pub.dev Flutter is Google’s UI toolkit for building beautiful, natively compiled applications for mobile, web, and desktop from a single codebase. **Flutter는 상태(State)에서 시작하여 상태(State)로 끝난다.** {{tag>Flutter Framework Mobile Hybrid}} = 필수 Library = == Alternate reflection == * Build runner * https://pub.dev/packages/build_runner Dart는 Reflection이 존재하지 않음. 이를 보완하기 위해 직접 대응하는 소스 코드를 생성한다. 이에 의존하는 라이브러리로는 [[https://pub.dev/packages/json_serializable|Json Serializable]], [[https://pub.dev/packages/mobx|MobX]]등이 있다. 아쉽게도 Java의 Lombok 혹은 Kotlin에 "data" class에 해당하는 라이브러리는 완성도가 좋지 않다. == JSON == [[https://pub.dev/packages/json_serializable|Json Serializable]] 아래 기술되어 있는 MobX, Retrofit은 해당 라이브러리를 지원한다. == State management == 공식 홈페이지에서는 Provider 사용을 권장하지만 완벽히 Widget으로부터 분리된 상태 관리를 원한다면 외부 Library도 좋은 선택이라 생각한다. * 참조 : https://flutter.dev/docs/development/data-and-backend/state-mgmt/options 아키텍처 패턴, Boilerplate등을 고려했을 때 MobX가 가장 최적이었다. * MobX * https://pub.dev/packages/mobx * https://pub.dev/packages/flutter_mobx * https://pub.dev/packages/mobx_codegen == REST == * [[https://pub.dev/packages/retrofit|Retrofit]] * [[https://pub.dev/packages/chopper|Chopper]] 둘 다 Android의 Retrofit을 영향 받아 구현한 라이브러리인데, BaseUrl을 Annotation 기반으로 선언하는 편리함에 있어서 Retrofit이 훨씬 좋은 디자인으로 생각된다. = Tips = == 사용자 상호작용 없이 상태 변경 == * https://stackoverflow.com/questions/54846280/calling-setstate-during-build-without-user-interaction MobX, Redux 등을 이용할 때 FCM을 받거나 Timer를 작동시켜 Widget을 변경 하려는 경우 아래와 같은 오류 메시지를 접하게 된다. setState() or markNeedsBuild() called during build. 이 경우 아래와 같이 Widget이 Rendering 된 후 상태를 변경시키면 된다. WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {}));