inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Flutter 앱 개발 실전

Tile

섹션3 - Tile 강의 질문

해결된 질문

274

gsbeom

작성한 질문수 2

2

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

 

flutter

답변 1

1

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;
}

 

감사합니다 :)

1

gsbeom

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

수강 기한 연장 요청드려도될까요..

1

48

2

37.provider 실습 문제점, 카트에서 상품이 지워지지 않습니다.

1

75

2

다트 프로젝트

1

51

2

context.read<LangService>().toggleLang 해도 언어가 변경되는 이유

1

74

3

수강 기간 연장 신청 요청드립니다.

1

68

3

수강기간 연장 부탁드립니다.

1

58

3

제공해주신 flutter_design_system 라이브러리 질문입니다.

1

53

2

수강 기간 연장 부탁드립니다

1

52

2

수강 기한 연장

1

78

3

강의 잘 보고있습니다!

1

59

2

애뮬레이터 실행 오류

1

69

2

pdf 강의노트

1

62

2

수강기간 연장 부탁드립니다.

1

86

2

수강 기간 연장 요청

1

86

2

수강기간 연장 부탁드립니다

1

129

2

코드 생성기 - build runner 관련 오류

1

111

1

디자인 시스템 구성에 대해 질문 드립니다

2

145

2

CartItem 추가시

1

95

2

const 커스텀클래스

1

95

1

강의 수강 기간 연장 요청드립니다.

1

127

2

코드 생성기 - 실습 build runner 안 되는 분.

1

270

2

Flutter 강의자료 열리지 않는 문제

1

165

2

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

1

123

2

수강 기강 연장 부탁드리겠습니다! :ㅇ

1

88

2