children 안의 if 문에서 { } 못쓰는 이유?
48
작성한 질문수 14
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if(show) GestureDetector(
onTap: () {
setState(() {
color = color == Colors.blue ? Colors.red : Colors.blue;
});
},
child: CodeFactoryWidget(
color: color
),
),
SizedBox(height: 32.0,),
ElevatedButton(
onPressed: () {
//print('Clikced!');
setState(() {
show = show == true ? false : true;
});
},
child: Text('클릭해서 보이기/ 안보이기'))
],
이렇게 인데,
if(show) 의 코드를 좀더 편하게 보기 위해 GestureDectector() 를 { } 로 묶어주려고하니까 오류가 뜨네요. 왜그런가요?
if() {} 이렇게 할 수 있지 않나요?
그리고 if() {} 안에 print() 넣으려고 하니 print 도 에러가 뜨네여
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if(show) { // if문 {} 로 묶어줌
GestureDetector(
onTap: () {
setState(() {
color = color == Colors.blue ? Colors.red : Colors.blue;
});
},
child: CodeFactoryWidget(
color: color
),
),
}
else print("Error"); // print 도 에러 뜸
SizedBox(height: 32.0,),
ElevatedButton(
onPressed: () {
//print('Clikced!');
setState(() {
show = show == true ? false : true;
});
},
child: Text('클릭해서 보이기/ 안보이기'))
],
),코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다!
[코드팩토리 디스코드]
https://bit.ly/3HzRzUM
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. dlengus14님께서 질문하신 내용에 대한 답변을 드리겠습니다.
Flutter의 children 속성에서 사용하는 경우, if-else 문을 {}으로 둘러쌀 수 없습니다. 이는 Flutter의 위젯 빌드 체계와 Dart 언어의 예외적인 문법 때문입니다. if 문은 Dart에서 하나의 표현식을 반환할 것이기 때문에, children 리스트에 포함될 위젯 자체로 사용해야 합니다. 따라서 중괄호 {}를 사용하는 것은 위젯이 아닌 문장의 집합을 의미하게 되어 문법 오류가 발생하는 것입니다.
질문에서 의도하신 바를 달성하기 위해서는 if 문 뒤에 단일 위젯을 두거나 삼항 연산자 ?:를 활용하여 조건에 따라 다른 위젯을 반환하는 방식이 필요합니다.
여기 Flutter에서 조건부 위젯을 사용하는 일반적인 방법에 대한 간단한 예시가 있습니다:
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
if (show)
GestureDetector(
onTap: () {
setState(() {
color = color == Colors.blue ? Colors.red : Colors.blue;
});
},
child: CodeFactoryWidget(
color: color
),
)
else
Text('Error'), // print 대신 다른 위젯을 사용합니다.
SizedBox(height: 32.0,),
ElevatedButton(
onPressed: () {
setState(() {
show = !show;
});
},
child: Text('클릭해서 보이기/ 안보이기'))
],
),
print()는 콘솔에 디버그 메시지를 출력하는 기능이므로, Flutter 위젯 트리에서는 위젯으로 사용할 수 없습니다. 대신 Text 위젯이나 메시지 박스 같은 위젯을 사용해야 합니다.
관련된 질문이 Row 위젯의 children의 [위젯1, 위젯2…] 안에서 if문에서 다뤄진 적이 있으니 참고하시면 좋겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
198강 (){onTap(e);}의 이해 돕기
0
28
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
77
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
이렇게 오류가 떠요
0
64
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
VoidCallback 뒤에 null 연산자 표기에 관한 질문
0
47
1





