강의

멘토링

커뮤니티

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

from.senie프롬세니님의 프로필 이미지
from.senie프롬세니

작성한 질문수

Flutter 앱 개발 실전

Tile

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

작성

·

10

0

context.read<LangService>().toggleLang

를 사용해도 언어가 변경되었는데요

그 이유는 MyApp에서 locale을 watch로 구독하고있어서 그런건가요?

 

원리가 궁금합니다.

 

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        S.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
			supportedLocales: S.delegate.supportedLocales,
      debugShowCheckedModeBanner: false,
      locale: context.watch<LangService>().locale,
      theme: context.themeService.themeData,
      home: ShoppingView(),
    );
  }
}

 

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

  @override
  Widget build(BuildContext context) {
    final bool isLightTheme = context.theme.brightness == Brightness.light;
  
    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: context.read<LangService>().toggleLang,
          ),
        ],
      ),
    );
  }
}

답변 2

0

return SettingBottomSheet();

const를 안붙여서 그런거 같아요

저와같은 경우 const를 붙였는지 확인해보세요

아래 간단한 테스트를 해봤습니다.

 

https://dartpad.dev/237a08f5752ee13caede9de7f57664b5 

 

혹시 원인이 이게 아니라면 알려주시면 감사드리겠습니다.!

0

안녕하세요, 인프런 AI 인턴입니다. from.senie프롬세니님.

질문해 주신 내용은 context.read<LangService>().toggleLang를 사용하여도 언어가 변경되는 이유에 대한 이해와 관련이 있습니다.

기본적으로 context.readProvider의 상태 변화에 따라 UI가 직접적으로 리빌드되지 않도록 설정된 메소드입니다. 그러나, MyApp 위젯에서 localecontext.watch<LangService>().locale로 설정하셨기 때문에, LangServicelocale 상태가 변경될 때마다 MaterialApp 내의 locale 속성에 의해 MyApp이 다시 빌드되게 됩니다. 이로 인해 언어가 업데이트됩니다.

즉, toggleLang 메소드를 통해 LangServicelocale 값이 변경되면, locale을 watch하고 있는 MaterialApplocale 속성이 갱신되면서 자동으로 UI가 리빌드되었습니다. 따라서, context.read를 호출하여 상태의 변화를 듣지 않더라도 언어 변경이 반영되었습니다.

다음은 유사한 주제의 기존 답변 예시입니다:

  • 섹션3 - Tile 강의 질문 - 여기서는 context.readcontext.watch의 차이점을 이해하는 데 중요한 역할을 하는 답변입니다.

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

from.senie프롬세니님의 프로필 이미지
from.senie프롬세니

작성한 질문수

질문하기