본문 바로가기
Flutter

[Flutter / Error / Debug] [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field '_viewId@865035241' has not been initialized.

by hymndaniel 2022. 4. 6.

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

 

 

728x90