해결된 질문
작성
·
208
2
SettingBottomSheet에서 ThemeServices는 context.read해도 되고, LangService는 context.watch로 해야하는 이유가 무엇인가요? toggleLang, toggleTheme 함수 안에서 똑같이 notifyListeners를 호출하는데 무슨 차이가 있는지 궁금합니다.
답변 1
1
안녕하세요.
먼저 context.read
와 context.watch
의 차이점은 다음과 같습니다.
context.read
: notifyListeners
를 호출해도 BuildContext가 소속된 Widget을 갱신 안함
context.watch
: notifyListeners
를 호출하는 경우 BuildContext가 소속된 Widget을 갱신함
아래 SettingBottomSheet
코드를 보면, LanguageService
는 context.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,
),
],
),
);
}
}
ThemeService
는 context.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;
}
감사합니다 :)
네 이해 됐습니다 감사합니다!