섹션 16, 상태 상위로 올리기에서 OnHeartPressed 함수 안의 showCupertinoDialog 함수내의 context 변수는 선언이 안되어 있는데 왜 컴파일 오류가 안나는건가요.
108
작성한 질문수 2
안녕하세요,
제가 무식한 질문인지는 모르겠는데,
void OnHeartPressed () {
showCupertinoDialog (
context : context, // <== 요 항목에서 context 라는 변수는 어디서 온건가요.
}
Build() 함수 바깥에서 별도로 선언된 함수니까 Build 내의 인자인 context 를 의미하지는 않을텐데
왜 컴파일 오류가 나지 않고 잘 실행이 되는건지 궁금합니다.
함수 포인터로 사용되는거 인식해서 상위 함수에 context 가 존재해서 그러는건가요?
답변 2
0
안녕하세요!
부모 위젯에서 제공해주는 기능입니다 (부모 위젯에 대한 정보는 제 Dart 언어 강의 참고 부탁드립니다)
StatelessWidget의 경우 부모 위젯에서 BuildContext를 제공해주지 않습니다. 그래서 함수에서 꼭 받아서 전달해야하지만. StatefulWidget의 경우 부모위젯에서 클래스 프로퍼티로 제공해줘서 사용 할 수 있습니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. wegaia님.
showCupertinoDialog에서 사용되는 context가 어디서 유래된 것인지 궁금하신 것 같습니다. Flutter에서는 BuildContext라는 개념이 매우 중요합니다. BuildContext는 위젯 트리 안에서 위젯의 위치를 나타내며, 위젯 트리의 부모-자식 관계를 이해하고 관리하는 데 사용됩니다.
OnHeartPressed 함수가 선언된 동일한 클래스나 위젯 내에서 context가 선언된 경우, 보통은 위젯의 생성자나 메서드를 통해 해당 BuildContext가 전달되었을 가능성이 큽니다. 일반적으로 다음과 같은 상황에서 context를 사용할 수 있습니다:
StatefulWidget이나StatelessWidget의build메서드에서context가 주어지는 경우.
State클래스에서widget속성을 통해 상위 위젯의BuildContext에 접근하는 경우.
아마도 OnHeartPressed 함수는 build 메서드나 위젯 트리 내에서 호출되기 때문에, 해당 위치에서 BuildContext가 전달되고 있을 가능성이 큽니다.
이를 더 명확히 설명하기 위해서는 실제 코드 구조를 살펴봐야 할 필요가 있습니다. 그러나 일반적인 경우에, 위젯 트리의 구조 덕분에 BuildContext가 전달된다고 볼 수 있습니다.
유사한 질문이 게시판에 있었던 것 같습니다. “U&I onPressed 질문”에서 비슷한 맥락으로 함수와 context에 대한 논의가 이루어졌습니다. 확인해보시면 도움이 될 것 같습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0
어휴, 늦은 밤에 질문한것도 죄송한데 곧바로 긴 답변까지 주셨네요.
그래도 제가 좀 띨띨해서 조금 헷갈려서 제가 제대로 이해한건지 좀만 더 질문드려볼게요.
말씀하신걸로 유추해보면 build 메서드 내에서 _Top() 클래스(위젯)의 생성자의 OnPressed 매개변수로 OnHeartPressed가 지정이 되었으니 그 위젯 트리 내에서 호출이 되는것이므로 명시적으로 Buildcontext가 OnHeartPressed함수의 매개변수로 전달되진 않지만 컴파일러는 암묵적으로 BuildContext 타입의 객체인 context 를 처리할 수 있다는 말씀처럼 들립니다. 제가 말하고도 헷갈리네요.
어쨋든 늦은밤에 감사합니다.
유사한 질문이라고 하신 "U&I onPressed 질문"에선 콜백함수를 지정하는것과 콜백함수가 가리키는 함수를 실행하는 것에 대한 차이에 대한 질문인 것 같습니다.
0
섹션 19, Navigator 사용해서 네이게이션 해보기 항목에 설명이 나와 있네요.
StatefulWiget 객체 내에서는 BuildContext 객체가 전역함수로 선언되어 있어서 각 함수 내에서 접근 가능하다는군요.
Stateless 객체 내에서는 불가능하답니다.
그래서 Build 함수 내에서 함수 호출시에 context 객체를 넘겨줘야 한다네요.
198강 (){onTap(e);}의 이해 돕기
0
26
1
video_call 플러그인 설치후 에러 발생
0
45
1
SDK 안드로이드 설치 질문!
0
60
1
코드팩토리 디스코드 링크 다시 부탁드려요~
0
92
1
Webview를 이용해서 URL 상의 페이지 출력 불가
0
70
1
홈스크린 함수를 함축해서 main.dart에 옮기는 문제
0
55
1
플레이스토어
0
59
1
아고라 엔진 init 함수의 반환타입이 Future<void> 이것의 의미는 무엇인가요?
0
55
1
가이드라인 질문
0
57
0
emulator 에러 환경설정 뭐가 문제 일까요??
0
76
1
emulator 실행 오류
0
93
3
Column을 가로방향 최대 사이즈를 차지하도록 하는 방법에 관련
0
71
1
pubspec.yaml에서 font를 추가하면서 weight 값을 지정하는 것이 의미가 있는 것인지 문의
0
43
1
setState()를 호출하지 않으면 build가 실행 안되는 건가요?
0
53
1
video_call 플러그인 설치시 에러문제
0
64
1
children 안의 if 문에서 { } 못쓰는 이유?
0
48
1
이렇게 오류가 떠요
0
63
1
AppBar 사용했는데
0
61
2
[문제해결] '오늘도 출첵!' 의 171번 강의에서 중요한 문제를 발견했습니다
0
56
1
StatefulWidget 실습 에러가 발생합니다.[해결완료]
0
63
1
Video Player 프로젝트에 대한 추가 질문
0
53
0
Row위젯이나 column위젯의 위치는 누가 정하나요??
0
42
1
geolocator 오류때문에 개발진행이 불가능입니다
0
63
1
API 관련 이슈
0
86
2





