inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Flutter 앱 개발 실전

Tile

Lang Tile

해결된 질문

234

gslee100

작성한 질문수 7

1

Tile(
  icon: 'language',
  title: S.current.language,
  subTitle: IntlHelper.isKo ? S.current.ko : S.current.en,
  onPressed: () => langService.toggleLang(),
)

안녕하세요.

강의 정말 큰 도움이 되고 있습니다!

Lang Tile 구현에서 onPressed 콜백에서 context.watch<LangService>().toggleLang() 으로 쓰면 왜 에러가 나는건가요,,??(아래와 같은 에러가 발생합니다..)


Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called

Provider.of without passing listen: false.

To fix, write:

Provider.of<LangService>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the

event handler, when the widget tree doesn't care about the value.

The context used was: SettingBottomSheet(dependencies: [_InheritedProviderScope<LangService?>, _InheritedProviderScope<ThemeService?>])

'package:provider/src/provider.dart':

Failed assertion: line 274 pos 7: 'context.owner!.debugBuilding ||

listen == false ||

debugIsInInheritedProviderUpdate'

flutter

답변 2

1

DevStory

안녕하세요.

아래와 같이 실행 했을 때 질문 주신 에러가 발생하셨을 겁니다.

Tile(
  onPressed: () => context.watch<LangService>().toggleLang(),
),

Provider 패키지의 context.watch<LangService>LangService에 변경사항이 있을 때 BuildContext가 소속된 위젯을 다시 빌드하여 화면을 갱신하도록 등록하는 과정이 포함되어 있습니다.

소스 코드상의 주석에서도 확인할 수 있듯 watch는 위젯의 Build() 함수 내부에서만 사용 가능하며, 그렇지 않은 경우 첨부해주신 에러가 발생합니다.

 

위젯의 Build() 함수 이외의 영역에서 조상 위젯에 접근하고 싶으신 경우 LangService에 접근하고 싶으신 경우 변경 사항을 청취하지 않는 context.read()를 사용하여 접근하시거나, 익명 함수를 없이 함수 자체를 넘기시면 정상적으로 작동합니다.

/// onPressed에 익명 함수를 삭제하신 뒤, toggleLang 함수 자체를 아래와 같이 넘겨주시면 정상 작동
Tile(
  onPressed: context.watch<LangService>().toggleLang,
),
/// context.read로 접근하면 정상 작동
Tile(
  onPressed: () => context.read<LangService>().toggleLang(),
),

감사합니다 :)

0

인프런 AI 인턴

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

질문하신 내용과 관련하여 LangService 객체를 context.watch를 사용하여 바라보려고 할 때 발생하는 에러에 대한 지식공유자님의 기존 답변을 찾았습니다. 해당 질문의 주된 내용은 context.watch 메소드를 사용할 때 발생하는 에러와 provider 패키지의 사용 방법에 대한 것입니다.

이와 관련하여, Flutter에서 Provider 패키지를 사용할 때 어떤 이벤트 핸들러(예: 버튼의 onPressed 콜백) 안에서 Provider.of()를 호출할 때 ‘listen’ 매개변수를 false로 설정하지 않으면 발생할 수 있는 에러에 대한 설명이 담긴 답변 링크를 첨부해드립니다. 이러한 에러를 방지하기 위해서는 이벤트 핸들러 내부에서 Provider.of<LangService>(context, listen: false) 코드를 사용하여 명시적으로 값을 듣지 않도록 설정해야 합니다. 이 경우, 위젯 트리가 값에 대해 걱정하지 않는 상황에서도 위젯이 불필요하게 다시 빌드되는 것을 방지할 수 있습니다.

아래는 유사한 문제에 대한 기존 답변 링크입니다:

  • 섹션3 - Tile 강의 질문
    • SettingBottomSheet에서 ThemeServices는 context.read를 사용해서 호출해도 되고, LangService는 context.watch로 호출해야 하는 이유를 설명하고 있습니다.

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

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

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

110

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