flutter Bad state: Cannot add new events after calling close

Pyo·2024년 1월 14일
0

개발을 하다보면 여러가지 에러를 마주하게 된다. 기껏 코드를 열심히 짯더니 에러를 뿜어내는 상황을 볼때 마다 눈앞이 깜깜해진다. 정리를 해둔다면 생각해서 하나씩 정리해 보겠다.

Bad state: Cannot add new events after calling close

우선 이런 에러 메세지가 발생하는 이유는 무엇일까??

발생하는 이유는 bloc 또는 스트림의 생명주기와 관련이 있다.

1. 스트림 닫힘(Closed Stream)

해당 오류는 주로 닫힌 스트림에 새로운 이벤트를 추가하려고 할 때 발생한다. 주로 스트림이 닫힌 후에 해당 스트림에 새로운 이벤트를 추가하려고 하는 상황에서 발생한다.

2.Bloc이 올바르게 폐기되지 않을때

Bloc이 사용되는 위젯이 화면에서 벗어날 때, 해당 Bloc이 적절하게 폐기(close)되지 않으면 해당 Bloc과 연결된 리소스들이 해제되지 않을 수 있다.

나 같은 경우에는 2번인상황에서 문제가 발생했다. 기존 bloc을 사용하는 화면에서 벗어날때 bloc을 적절하게 폐기하지 않아서 발생했다. 사용하지 않는 bloc을 폐기 하는 이유는 메모리 누수와 같은 문제가 발생할 수 있다. Bloc을 더 이상 사용하지 않게 되면, 메모리를 효율적으로 관리하기 위해 Bloc을 닫는 것이 좋다.

해결 방법

1,2번 문제 모두 bloc,stream이 정상적으로 닫히지 않거나 , 닫혔을때 이벤트를 발생 시켰기 때문에 발생하는 문제 이다. 따라서 우선 bloc,stream을 사용하지 않는다면 바르게 닫아주어야 하고 , 다시 사용하게 되는 상황이 생기면 initState()함수에서 bloc을 적절하게 생성해주면 에러를 해결할수 있다.

bloc 닫기

@override
void dispose() {
  myBloc.close();
  super.dispose();
}
  @override
  Future<void> close() {
    _myController.close();
    return super.close();
  }

bloc 생성

void initState() {
    bloc = widget.bloc;

		if (bloc!.isClosed) {
        bloc = TestBloc(
          testRepository: context.read<TestRepository>,
        );
    }

    super.initState();
}

정리

"Bad state: Cannot add new events after calling close" 오류는 주로 스트림 관리와 Bloc 생명주기 관리와 관련이 있다. 올바른 Bloc 사용 패턴과 생명주기 관리를 통해 이러한 문제를 효과적으로 해결할 수 있다.

0개의 댓글

관련 채용 정보