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

gsbeom님의 프로필 이미지
gsbeom

작성한 질문수

Flutter 앱 개발 실전

Tile

섹션3 - Tile 강의 질문

해결된 질문

작성

·

208

2

SettingBottomSheet에서 ThemeServices는 context.read해도 되고, LangService는 context.watch로 해야하는 이유가 무엇인가요? toggleLang, toggleTheme 함수 안에서 똑같이 notifyListeners를 호출하는데 무슨 차이가 있는지 궁금합니다.

 

답변 1

1

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

안녕하세요.

먼저 context.readcontext.watch의 차이점은 다음과 같습니다.

  • context.read : notifyListeners를 호출해도 BuildContext가 소속된 Widget을 갱신 안함

  • context.watch : notifyListeners를 호출하는 경우 BuildContext가 소속된 Widget을 갱신함

 

아래 SettingBottomSheet 코드를 보면, LanguageServicecontext.watch로 접근하고 있기 때문에 toggleLang에서 notifyListeners 호출시 갱신됩니다.

class SettingBottomSheet extends StatelessWidget {
  const SettingBottomSheet({super.key});

  @override
  Widget build(BuildContext context) {
    final bool isLightTheme = context.theme.brightness == Brightness.light;
    final LangService langService = context.watch();
    return BaseBottomSheet(
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          /// Theme Tile
          Tile(
            icon: isLightTheme ? 'sunny' : 'moon',
            title: S.current.theme,
            subtitle: isLightTheme ? S.current.light : S.current.dark,
            onPressed: context.read<ThemeService>().toggleTheme,
          ),

          /// Lang Tile
          Tile(
            icon: 'language',
            title: S.current.language,
            subtitle: IntlHelper.isKo ? S.current.ko : S.current.en,
            onPressed: langService.toggleLang,
          ),
        ],
      ),
    );
  }
}

ThemeServicecontext.theme.brightness로 접근하고 있는데, theme_service.dart 파일에 ThemeServiceExt를 보면, 결국 context.watch<ThemeService>().theme.brightness와 동일한 코드이므로 마찬가지로 toggleTheme 함수에서 notifyListeners 호출시 위젯이 갱신됩니다.

extension ThemeServiceExt on BuildContext {
  ThemeService get themeService => watch<ThemeService>();
  AppTheme get theme => themeService.theme;
  AppColor get color => theme.color;
  AppDeco get deco => theme.deco;
  AppTypo get typo => theme.typo;
}

 

감사합니다 :)

gsbeom님의 프로필 이미지
gsbeom
질문자

네 이해 됐습니다 감사합니다!

gsbeom님의 프로필 이미지
gsbeom

작성한 질문수

질문하기