bloc은 깔끔한 패턴이지만, 가끔 어느 레이어에 두어야 할지 애매한 것들이 있다.
대표적인 것이 TextEditingController 같은 컨트롤러들이다.
아래 이슈를 보자.
[Question] What is the best practices to work with TextEditingControllers.
이 코멘트를 보면
https://github.com/felangel/bloc/issues/2293#issuecomment-814359073
I would highly recommend against maintaining
TextEditingController
as part of the bloc. Blocs should ideally be platform-agnostic and have no dependency on Flutter. If you need to useTextEditingControllers
I would recommend creating aStatefulWidget
and maintaining them as part of theState
class. Then you can interface with the control in response to state changes viaBlocListener
.
felangel 은
TextEditingController를 사용한다면, 컨트롤러를 Bloc 바깥으로 빼고 StatefulWidget을 사용할 것을 추천하고 있다.
블록을 Flutter에 의존성이 없게 유지해야 한다는 이유를 들었는데, 이견이 있을지도 모르지만 나는 동의한다. Bloc을 쓰면 Stateful을 전혀 사용하지 말아야 한다는 주장을 하는 사람들도 분명히 있다.
하지만 결국 성능 이슈가 없다면, 구현이 편하고 간단한 쪽을 택하는 것이 버그를 없애는 길이다. 그리고 바닐라 플러터를 최대한 유지하려고 애쓰는 것이 미래에 생길 이슈 대응에도 좋다고 생각한다.
아래 gist 처럼 구현하면 된다.
굳이 블록에 넣겠다고 하면 Stream을 쓰던지 BehaviorSubject 를 이용하던지 하고, textfield는 controller를 반강제하기 때문에 대신 textformfield를 이용해서 구현해야 한다. 하지만 굳이 왜...
블록에 넣는 방법은 아래 링크에 더 자세하게 있다.
https://github.com/blado-runnero/flutter_form_validations_with_streams/blob/main/lib/main.dart