Flutter 중급반 스터디 14기 3주차
2023-07-10 00:00:00
# flutter-study-14th
14기 3주차 강민
이번주 한 업무 외 개발들
- 사이드 프로젝트 UI 부분만 개발
- dynamic_image_crop 패키지 widget test 작성하다가 실패함
위젯 테스트 실패… -> 겨우 성공
위젯이 처음에 한번 빌드되고 나서 GlobalKey가 할당되기 전에
currentState 값을 사용하려고 해서 에러가 났다.
1 | /// Crop the image as you can see on the screen. |
1 | ══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════ |
원인
- 이 위젯은 시작할 때 initState() 함수 안에서 비동기로 imageSize 값을 초기화한다.
(현재 화면 크기에 맞춰 이미지 사이즈를 조절해야 한다.) - imageSize 값이 초기화 되기 전까지 Container() 위젯이었다가, imageSize 값이 초기화되면 setState(() {}) 을 실행해 다시 렌더링한다.
- 그 때 _painterKey를 key로 사용하는 위젯이 빌드된다.
- 근데 테스트 코드에서 이 _painterKey가 Widget의 key로 할당되기 전에 currentState를 호출해서 null 에러가 발생했다.
시도한 방법
테스트 코드에서 빌드가 될 때까지 좀 기다려주기 → 실패
await Future.delayed(const Duration(seconds: 1));
이런 방식으로 await 걸면 테스트 함수 안에서 다음 라인의 코드가 동작하지 않음await tester.pumpWidget()
await tester.pumpAndSettle()
이런 테스트 함수 내에 Duration을 설정할 수 있지만 기다려주지 않음
HELP!!!!!!!!테스트 성공 -> tester.runAsync() 사용해서 기다려주면 된다.
1 | import 'package:flutter_test/flutter_test.dart'; |
- 테스트 코드 전체
1 |
|
사이드 프로젝트 UI 작업 짧게
- AnimatedSwitcher, AnimatedOpacity, AnimatedContainer
EventChannel을 어쩔 수 없이 쓰게 된 사례
- 원인: Native 코드에서 callback으로밖에 구현이 안되는 상황
상세내용
- 모든 앱을 관리하는 중앙집중형(?) 부모 앱(Android) → 자식 앱 (flutter)
- 앱 권한을 계속 거부해서 더이상 팝업이 안뜨면 부모 앱 호출
- 부모 앱은 권한을 받아야 한다는 팝업 노출 후 설정 화면으로 이동 (삼성 기기의 Knox 연동으로 네비게이션 바를 강제로 감춤)
- 결과를 다시 받으면 권한 여부 확인
1 | class NativeFunctions { |
1 | // 1 |
- FlutterActivity는 onActivityResult()가 deprecated X → 일반적으로(?) 사용하는 Activity 상속 클래스들은 deprecated 였지만!
- 권한이 그래도 없다면 앱을 종료시켜 버림 → 부모앱 화면으로 돌아감