본문 바로가기
Flutter/Flutter FAQ

Flutter dispose() 이 호출된 후에 setState() 가 호출되었습니다., setState() called after dispose()

by 베타코드 2023. 5. 16.
반응형

질문


제가 raised 버튼을 클릭하면, timepicker가 표시됩니다. 이제, 예를 들어 5초를 기다리고 시간을 확인하면 이 오류가 발생합니다: setState() called after dispose()

저는 말 그대로 콘솔에서 플러터가 부모 위젯을 업데이트하는 것을 볼 수 있는데, 왜 그렇게 되는 걸까요? 제가 아무것도 하지 않고 5초를 기다리는데?! 아래 예제는 일반 프로젝트에서 작동하지만, 제가 만든 프로젝트는 훨씬 복잡하기 때문에 작동하지 않습니다... 무엇이 잘못되었을까요? 플러터가 내 프로젝트에서 무작위로 업데이트하는 것이 무엇인지 추측할 수 있는 사람이 있나요?

[업데이트] 두 번째로 살펴보니, TabBarTabBarView가 있는 수준에서 업데이트되는 것을 발견했습니다. 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);
    }
  }
}
반응형

댓글