반응형
질문
제가 raised 버튼을 클릭하면, timepicker가 표시됩니다. 이제, 예를 들어 5초를 기다리고 시간을 확인하면 이 오류가 발생합니다: setState() called after dispose()
저는 말 그대로 콘솔에서 플러터가 부모 위젯을 업데이트하는 것을 볼 수 있는데, 왜 그렇게 되는 걸까요? 제가 아무것도 하지 않고 5초를 기다리는데?! 아래 예제는 일반 프로젝트에서 작동하지만, 제가 만든 프로젝트는 훨씬 복잡하기 때문에 작동하지 않습니다... 무엇이 잘못되었을까요? 플러터가 내 프로젝트에서 무작위로 업데이트하는 것이 무엇인지 추측할 수 있는 사람이 있나요?
[업데이트]
두 번째로 살펴보니, TabBar
와 TabBarView
가 있는 수준에서 업데이트되는 것을 발견했습니다.
TabBarView
에 필요한 "with TickerProviderStateMixin"과 관련이 있을까요? 앱을 정기적으로 무작위로 새로 고침하게 만드는 원인이 될 수 있을까요?
class DateTimeButton extends State<DateTimeButtonWidget> {
DateTime selectedDate = new DateTime.now();
Future initTimePicker() async {
final TimeOfDay picked = await showTimePicker(
context: context,
initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute),
);
if (picked != null) {
setState(() {
selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
});
}
}
@override
Widget build(BuildContext context) {
return new RaisedButton(
child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
onPressed: () {
initTimePicker();
}
);
}
}
답변
위젯의 상태 클래스의 부울 속성 mounted
를 호출하기 전에 setState()
를 호출하는지 확인하세요.
if (this.mounted) {
setState(() {
// 여기에 상태 변경 코드를 입력하세요
});
}
또는 더 깔끔한 방법으로, StatelfulWidget
클래스에서 setState
메서드를 재정의하세요.
class DateTimeButton extends StatefulWidget {
@override
void setState(fn) {
if(mounted) {
super.setState(fn);
}
}
}
반응형
댓글