[Flutter] Future Builder를 활용해 Display하기
2023. 3. 17. 01:20ㆍDevelopers 공간 [Shorts]/Frontend
728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew,
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter
- Module Bundler : React, Webpack, Parcel
B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS
C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight
1. What? (현상)
카메라 패키지를 사용하는 위젯에서 초기화하는 과정에 async한 작업들이 들어가는데, async하게 초기화되는 변수에 따라서 다르게 렌더링하는 것이 잘 되지 않았습니다.
stateful 위젯의 경우는 아래처럼 initState()에서 .then()을 활용해 late 변수를 초기화하고 ,
late CameraController camController; @override void initState() { super.initState(); camController = CameraController(widget.camera, ResolutionPreset.max); camController.initialize().then((_) { if (!mounted) { return; } setState(() {}); }).catchError((Object e) { if (e is CameraException) { switch (e.code) { case 'CameraAccessDenied': // Handle access errors here. break; default: // Handle other errors here. break; } } }); }
future 값이 초기화 되었는지를 확인해 아래와 같이 렌더링 하는 방식을 활용하면 됩니다.
if (!camController.value.isInitialized) { return Container( width: MediaQuery.of(context).size.width, child: CircularProgressIndicator( semanticsLabel: 'Circular progress indicator', ) ); } return LayoutBuilder( builder: (context, constraints) { return SizedBox( width: constraints.maxWidth, height: constraints.maxHeight, child: CameraPreview(camController), ); }, );
근데 초기화가 잘되었는데도 불구하고, 가끔가다가 초기화된 변수의 상태를 반영해 렌더링하는 것이 잘 되지 않아 안정적으로 구현하고 싶습니다.
2. Why? (원인)
- 처음엔 제가 사용하고 있는 ChangeNotifier 클래스에서 notifyListeners()를 하지 않아 생긴 문제인줄 알았지만, 해주어도 현상이 변하지 않습니다.
- async하게 변경되는 camController.value.isInitialized 값을 반영해 렌더링해야 하는데, 이것이 잘되지 않아서 그렇습니다.
3. How? (해결책)
- FutureBuilder를 활용해 display하면 더 안정적으로 구현할 수 있습니다.
- 아래처럼 Future를 저장해두고(_initializeControllerFuture)
late CameraController camController; Future<void>? _initializeControllerFuture; @override void initState() { super.initState(); camController = CameraController( widget.camera, ResolutionPreset.medium, ); _initializeControllerFuture = camController.initialize(); }
- FutureBuilder()를 활용해 해당 Future object가 완성이 됐을 때와 아닐때를 구분해 렌더링하도록 구현합니다.
FutureBuilder<void>( future: _initializeControllerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return CameraPreview(_controller); } else { return Center(child: CircularProgressIndicator()); } }, )
https://flutter-ko.dev/docs/cookbook/plugins/picture-using-camera
728x90
반응형
'Developers 공간 [Shorts] > Frontend' 카테고리의 다른 글
[Flutter] 위젯을 이미지로 찍어내기 (0) | 2023.03.19 |
---|---|
[Flutter] Stacked Services Navigator 정리 (0) | 2023.03.19 |
[Flutter] 미리 정해놓으면 좋은 것들 (Theme, Icon, Block, Sound...) (0) | 2023.03.12 |
[Flutter] List/GridView의 Item 만드는 다양한 방법 (0) | 2023.03.12 |
[Flutter] Custom Scrollable Tabbar 구현하기 (0) | 2023.03.12 |