[flutter] Stateless widget일 때 TextFormField 사용하면? (Using TextFormField in Stateless widget)

💜Dabo (개발자 다보)·2020년 5월 26일
1

Using TextFormField in Stateless widget

https://stackoverflow.com/questions/51980118/using-textformfield-in-stateless-widget-is-very-difficult-in-flutter

  • TextEditingController는 렌더링간에 유지되어야하는 클래스 인스턴스입니다. 그러나 StatelessWidget에 저장하면 기본적으로 모든 업데이트 후에 다시 만듭니다.
    (recreate it after every update.)
  • 그러니 Stateful Widget 으로 생성하시오.

https://flutter.dev/docs/cookbook/forms/text-field-changes

  • TextFormField 생성할 때도 공식문서에서도 stateful widget으로 생성하라고 나와있군요.

https://stackoverflow.com/questions/55549663/do-stateless-widgets-dispose-on-their-own

  • Stateless Widget은 즉각,즉시는 아니지만 파기할때 objects가 disposed 안된다는 것을 나타냅니다.
  • 어찌됐든TextEditingController를 사용하거나 변경가능한 상태를 유지하는 경우 Stateful Widget을 사용해 State 클래스에 상태를 유지해야합니다.
  • Stateless Widget를 사용하면, UI가 rebuilt(재빌드)될 때 마다 state가 손실됩니다.
  • Stateful Widget 일때
    • keep their state rebuilds(재빌드) because the state is in the State class,
    • parents call setState
    • re-using the previous State
    • letting it keep the values stored in its mutable member fields.
  • cf. https://stackoverflow.com/questions/43873752/keeping-final-fields-on-the-widget-or-the-state/43874673#43874673



결론

  • 재빌드가 되도 상태값을 유지하려면 Stateful Widget사용
  • dispose()에 적고싶은 코드가 있다는것 자체가 Stateful Widget을 써줘야함.
  • Stateless Widget은 재빌드될 때 상태(state)값 손실
  • TextEditingController는 렌더링간에 유지되어야하는 클래스 인스턴스,
    그런 변수를 매번 다시만들지 않게끔, state를 관리해주는 Stateful Widget필요
profile
𝙸 𝚊𝚖 𝚊 𝚌𝚞𝚛𝚒𝚘𝚞𝚜 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚎𝚛 𝚠𝚑𝚘 𝚎𝚗𝚓𝚘𝚢𝚜 𝚍𝚎𝚏𝚒𝚗𝚒𝚗𝚐 𝚊 𝚙𝚛𝚘𝚋𝚕𝚎𝚖. 🇰🇷👩🏻‍💻

4개의 댓글

comment-user-thumbnail
2020년 8월 3일

1시간동안 TextEditingController 로그가 왜안찍히나 고민하고있었는데... 덕분에 원인을 알게됐습니다. 감사합니다

1개의 답글
comment-user-thumbnail
2020년 9월 19일

플러터 하시는 누나가 이렇게 이뻐도 되나요..
고급 스택들 잘 정리해주셔서 감사합니다.

답글 달기
comment-user-thumbnail
2020년 10월 27일

다보님이 적어주신 내용이 더 best practice 입니다만,
InheritedWidget 의 동작과 흡사한 Provider 혹은 Stream 객체를 이용할 경우 dispose 시켜야할 객체들을 Provider Model 안에 삽입해주면 StatelessWidget을 사용하더라도 Widget이 그려지는 특성상 전체를 build하지 않고 필요부분만 교체시킬 수 있습니다.
다만, 다보님 말씀처럼 Controller와 같이 business logic이 아닌 UI 자체에 가깝게 붙어있어야할 기능은 StatefulWidget을 사용하여 처리하는 게 맞습니다.

좋은 내용 감사합니다.

답글 달기