인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이민형 (데이도어)님의 프로필 이미지

작성한 질문수

Flutter 앱 개발 실전

Tile

riverpod 프로젝트에 궁금한점이 있어 질문 남깁니다.

해결된 질문

작성

·

75

·

수정됨

1

riverpod이 적용된 프로젝트에서 SettingBottomSheet의 언어변경 Tile위젯을 클릭하여 언어 변경시 bottomSheet는 리빌드 되지않는 현상이 있습니다!

해당 위젯에서 langServiceProvider를 watch하지 않고 notifier를 watch해서 생기는 문제로 생각되는데 맞는지 궁금합니다.

해결방법으로

subTitle: ref.watch(langServiceProvider).languageCode == 'ko' ? S.current.ko : S.current.en,
onPressed: ref.read(langServiceProvider.notifier).toogleLang,

이런식으로 처리 했는데 이것도 괜찮은 방법인지 궁금합니다.

또한 bottomSheet가 아닌 부분은 왜 리빌드가 되는지도 궁금합니다!

답변 2

1

DevStory님의 프로필 이미지
DevStory
지식공유자

안녕하세요 이민형님

Q1. Riverpod 적용시 언어 변경을 해도 SettingBottomSheet가 리빌드 되지 않습니다.

말씀해 주신 "langServiceProvider를 watch하지 않고 notifier를 watch해서 생기는 문제"가 맞습니다. 또한 제안해 주신 해결 방법도 괜찮으며 관련 코드를 수정하여 배포해 두었습니다.

 

Q2. SettingBottomSheet 이외 부분은 왜 리빌드가 되는지 궁금합니다.

기본적으로 MaterialApp에서 Local 값이 변경되는 경우, InheritedWidget 기반으로 Localizations 위젯을 포함하는 트리 하위 위젯들이 자동 리빌드 되는게 맞습니다.

하지만 SettingBottomSheetshowModalBottomSheet를 이용하여 화면을 생성하는데, 내부적으로 하위 경로와 상호 작용하지 못하도록 막는 PopupRoute 를 이용하므로 기본적으로 Material의 InheritedWidget에 리스너로 등록되지 않으며 독립적인 context를 가지므로 명시적으로 직접 갱신을 해주어야 합니다.

 

제보 감사합니다 🙂

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 이민형(데이도어)님.

LangService에서 언어 변경 시 SettingBottomSheet가 리빌드되지 않는 문제에 대해 질문해 주셨군요.

언어 변경을 위한 Provider 사용 방식에서는 ref.watch(langServiceProvider)를 사용하여 언어 상태를 관찰하도록 만드는 것이 맞습니다. 위젯을 리빌드하려면 state를 watch해야 하기 때문입니다.

현재 제안하신 코드에서는 languageCode 상태를 ref.watch(langServiceProvider)를 통해 감시하고, 따라서 지정된 언어에 따라 서브타이틀이 변경됩니다. 언어 변경 버튼을 클릭하면 ref.read(langServiceProvider.notifier).toggleLang으로 언어 변경하는 방법도 올바른 접근 방식입니다. 이로 인해 bottomSheet가 리빌드되지 않는 문제는 해결될 것입니다.

즉, 언어 상태를 watch하여 변화가 있을 때마다 UI가 리빌드되어야 하므로 제안하신 방법이 효과적으로 작동할 수 있습니다.

관련하여 유사한 질문과 답변이 있는 페이지를 안내해 드리겠습니다:
- 섹션3 - Tile 강의 질문 - 여기서는 context.readcontext.watch의 차이점을 설명하고, 각각의 역할을 어떻게 사용하는지에 대한 답변이 포함되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.