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

wegaia님의 프로필 이미지
wegaia

작성한 질문수

[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

섹션 16, 상태 상위로 올리기에서 OnHeartPressed 함수 안의 showCupertinoDialog 함수내의 context 변수는 선언이 안되어 있는데 왜 컴파일 오류가 안나는건가요.

작성

·

44

0

안녕하세요,

제가 무식한 질문인지는 모르겠는데,

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를 사용할 수 있습니다:

  1. StatefulWidget이나 StatelessWidgetbuild 메서드에서 context가 주어지는 경우.
  2. State 클래스에서 widget 속성을 통해 상위 위젯의 BuildContext에 접근하는 경우.

아마도 OnHeartPressed 함수는 build 메서드나 위젯 트리 내에서 호출되기 때문에, 해당 위치에서 BuildContext가 전달되고 있을 가능성이 큽니다.

이를 더 명확히 설명하기 위해서는 실제 코드 구조를 살펴봐야 할 필요가 있습니다. 그러나 일반적인 경우에, 위젯 트리의 구조 덕분에 BuildContext가 전달된다고 볼 수 있습니다.

유사한 질문이 게시판에 있었던 것 같습니다. “U&I onPressed 질문”에서 비슷한 맥락으로 함수와 context에 대한 논의가 이루어졌습니다. 확인해보시면 도움이 될 것 같습니다.

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

wegaia님의 프로필 이미지
wegaia
질문자

어휴, 늦은 밤에 질문한것도 죄송한데 곧바로 긴 답변까지 주셨네요.

그래도 제가 좀 띨띨해서 조금 헷갈려서 제가 제대로 이해한건지 좀만 더 질문드려볼게요.

말씀하신걸로 유추해보면 build 메서드 내에서 _Top() 클래스(위젯)의 생성자의 OnPressed 매개변수로 OnHeartPressed가 지정이 되었으니 그 위젯 트리 내에서 호출이 되는것이므로 명시적으로 Buildcontext가 OnHeartPressed함수의 매개변수로 전달되진 않지만 컴파일러는 암묵적으로 BuildContext 타입의 객체인 context 를 처리할 수 있다는 말씀처럼 들립니다. 제가 말하고도 헷갈리네요.

어쨋든 늦은밤에 감사합니다.

유사한 질문이라고 하신 "U&I onPressed 질문"에선 콜백함수를 지정하는것과 콜백함수가 가리키는 함수를 실행하는 것에 대한 차이에 대한 질문인 것 같습니다.

wegaia님의 프로필 이미지
wegaia
질문자

섹션 19, Navigator 사용해서 네이게이션 해보기 항목에 설명이 나와 있네요.

StatefulWiget 객체 내에서는 BuildContext 객체가 전역함수로 선언되어 있어서 각 함수 내에서 접근 가능하다는군요.

Stateless 객체 내에서는 불가능하답니다.

그래서 Build 함수 내에서 함수 호출시에 context 객체를 넘겨줘야 한다네요.

 

wegaia님의 프로필 이미지
wegaia

작성한 질문수

질문하기