VlcPlayer 플러그인을 사용할 때 controller를 late로 선언,
다른 페이지로 넘어갈때, controller를 dispose,
정상적인 의도로 앱을 사용할때는 문제 없음
하지만 테스트 목적으로 페이지간 전환을 빠르게 할때 위의 에러 발생.
예상되는 원인 : vlcPlayerController를 초기화 되는 과정에서 dispose되어 버림 ;
테스트1 : vlcPlayerController와 관련된 모든 코드를 주석처리하고 에러 테스트 ;
테스트1 결과 : 에러 안남
테스트 2 : vlcPlayerController를 선언하는 코드와 dispose하는 코드만 살려보고 테스트
late VlcPlayerController _vlcPlayerController;
@override
void dispose() async {
super.dispose();
WidgetsBinding.instance?.removeObserver(this);
_vlcPlayerController.dispose();
}
테스트 2 결과 : 에러 발생
구글링 키워드 : flutter late variable dispose
답변 : 초기화 여부를 체크해야할 때는 late 사용을 피하는게 좋음. dart에서는 late 변수의 초기화 여부를 체크하는 방법을 제공하지 않음. 대신 nullable 로 만들어 사용하는 것이 더 명확함. 그런 다음 null인지 확인하여 변수가 초기화 되었는지 확인할 수 있음.
테스트3 : late 변수를 사용하지 않고 nullable로 변경
VlcPlayerController? _vlcPlayerController;
@override
void dispose() async {
super.dispose();
WidgetsBinding.instance?.removeObserver(this);
_vlcPlayerController?.dispose();
print('diposed');
}
테스트3 결과 : 에러 안남
테스트4 : initState에서 _vlcPlayerController에VlcPlayerController.network 할당
@override
void initState() {
super.initState();
_initVlcPlayer();
WidgetsBinding.instance?.addObserver(this);
print('initialized');
}
테스트4 결과 : 빠르게 화면을 전환할때는 에러가 안나지만 느리게 전환할때는 에러 발생
테스트5 : rtspUrl을 받아오는 과정에서 에러인지 테스트 ; rtspUrl을 임의의 고정 값으로 변경하여 테스트
테스트5 결과 : 에러 발생 ; VlcPlayerController.network이 실행될때 에러로 예상(영상과 연결하고 제어를 위한 준비 작업이 진행될때)
구글링 키워드 : flutter VlcPlayerController.network dispose error ; 부적합
..flutter controller dispose ; 부적합
테스트6 : 예외처리하기
@override
void dispose() async {
super.dispose();
WidgetsBinding.instance?.removeObserver(this);
try {
_vlcPlayerController?.dispose();
} catch (e) {
print('Error: $e');
}
}
테스트6 결과 : Unhandled Exception 에러발생 빈도는 현저히 낮지만 완전히 사라지지 않음
콘솔에 여전히 간헐적으로 에러가 발생하지만 앱이 꺼지거나 비정상적으로 동작하는 상황은 아니므로 여기서 일단락지음
References
https://stackoverflow.com/questions/67197902/how-to-check-late-variable-is-initialized-in-dart
How to check 'late' variable is initialized in Dart
In kotlin we can check if the 'late' type variables are initialized like below lateinit var file: File if (this::file.isInitialized) { ... } Is it possible to do something similar to this in D...
stackoverflow.com
'Flutter' 카테고리의 다른 글
[Flutter] Container left align; 왼쪽으로 정렬하기 (0) | 2022.04.06 |
---|---|
[Flutter] GestureDetector touch area; 터치 영역이 작을때 (0) | 2022.04.06 |
[Flutter / Android] Unsupported Android Plugin version 에러 처리(문제 해결에 대한 회고록) (0) | 2022.04.05 |
[Flutter / Android] 안드로이드 개발자 모드 활성화 (0) | 2022.04.04 |
[Flutter / Android] Warning: Mapping new ns 경고 해결 (0) | 2022.04.02 |