프로그래밍/flutter

FixedExtentScrollController 사용시 오류 처리.

인썸니아 2021. 9. 25. 16:18

Flutter 2.5.1
Dart 2.14.2

책의 예제를 테스트 하던 중 못보던 오류가 갑자기 발생하였다.

======== Exception caught by foundation library ====================================================
The following assertion was thrown while dispatching notifications for FixedExtentScrollController:
'package:flutter/src/rendering/object.dart': Failed assertion: line 2666 pos 12: '!_debugDisposed': is not true.

CupertinoPicker 위젯에서 scrollController 속성에 적용한 FixedExtentScrollController 에서 발생한 오류인데, 도통 원인을 알 수가 없었다. 오류 stack을 따라가봐도 내가 만든 코드가 아니라 flutter의 기본 코드들이다.

당연히 구글링을 시작했고,
동일한 오류에 대한 내용을 발견했다.

원인 및 해결책

https://issueexplorer.com/issue/flutter/flutter/90123

 

Failed assertion: line 2666 pos 12: '!_debugDisposed': is not true. - Flutter/Flutter

════════ Exception caught by foundation library ════════════════════════════════ The following assertion was thrown while dispatching notifications for FixedExtentScrollControl

issueexplorer.com


마지막 즈음의 댓글에 원인과 해결책이 나오는데,

해결댓글 이미지

질문자는 처음에 controller 변수를 global 로 선언하였었나보다.
어쨌든, 처음 한번은 controller instance가 존재하므로 정상 동작했지만, picker 위젯을 나올때 controller가 dispose 되므로, 이후에 다시 picker 위젯으로 진입하면 controller instance가 없기 때문에 문제가 된다는 내용이다.

updated된 sample을 보면 FixedExtendScdrollController 변수를 class 내부로 옮긴 것을 확인할 수 있다.

문제해결

내가 테스트하던 예제는, Popup 에 의해 CupertinoPicker 위젯을 띄우도록 하였는데, 처음 한번은 정상동작 하지만 popup을 닫은 후 다시 진입하면 오류가 발생했었다. 위의 해결책에 설명된 대로, popup을 닫을때 controller가 dispose 되는 것을 감안하여 controller 를 함수 내부로 옮겼고, 오류 해결되었다.

한가지 확인이 필요한 부분은 이 오류가 flutter 2.5 버전으로 update 한 이후에 새롭게 발생했다는 점이다. 저 링크의 질문자도 flutter 2.5 업데이트 이후에 확인된 문제라고 한다. 추후 flutter 업데이트에서 다시 수정이 될 가능성이 있다는 뜻! 
실제로 본 문제는 명시적으로 controller를 dispose 한게 아닌데도 불구하고 widget을 빠져나오면서 자동으로 dispose 되어버린게 원인이 된 것이다. flutter 자체적으로 수정이 되어야 할 부분이라고 생각한다.

 

반응형