함수
Flutter 콜백과 validator, builder를 이해하기 위한 함수 기본기를 정리합니다.
핵심 개념
함수에서 먼저 구분할 요소
반환 타입
함수가 돌려주는 값의 타입입니다. 아무 값도 돌려주지 않으면 void를 사용합니다.
언제 쓰나: 계산 결과를 다음 코드에서 사용해야 하면 반환 타입을 명확히 적습니다.
Flutter에서: validator는 String?을 반환하고, build는 Widget을 반환합니다.
// 문자열을 반환하는 함수입니다.
String makeTitle(String name) {
return '안녕하세요, $name';
}
// 값을 반환하지 않고 출력만 하는 함수입니다.
void logTitle(String title) {
print(title);
}
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'실행 출력',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('> title')
],
)
],
),
)
named parameter
인자 이름을 붙여 전달하는 매개변수입니다. Flutter 생성자에서 거의 표준처럼 쓰입니다.
언제 쓰나: 인자가 여러 개라 순서만으로 의미를 알기 어려울 때 사용합니다.
Flutter에서: TextStyle(fontSize: 16, fontWeight: FontWeight.bold) 같은 호출이 모두 named parameter입니다.
Widget lessonButton({
required String title,
required VoidCallback onPressed,
}) {
return ElevatedButton(
onPressed: onPressed,
child: Text(title),
);
}
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'작업 실행',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('버튼을 누르면 콜백이 실행됩니다.')
],
),
ElevatedButton(
onPressed: () {},
child: const Text('실행'),
)
],
),
)
콜백 함수
나중에 실행되도록 다른 함수나 위젯에 전달하는 함수입니다.
언제 쓰나: 버튼 클릭, 입력 변경, 저장 완료 같은 이벤트에 반응해야 할 때 사용합니다.
Flutter에서: onPressed, onChanged, itemBuilder, builder가 대표적인 콜백 자리입니다.
TextField(
// 사용자가 글자를 입력할 때마다 실행되는 콜백입니다.
onChanged: (value) {
print('현재 입력값: $value');
},
)
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'강의 제목',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
Chip(label: Text('입력 대기')),
Chip(label: Text('검증'))
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('제목을 입력하세요'),
Text('저장 버튼 비활성화')
],
)
],
),
)
상세 설명
더 알아보기
함수는 화면 코드가 길어질 때 먼저 분리할 수 있는 단위입니다. 입력 검증, 표시 문구 만들기, API 응답 가공처럼 이름이 붙는 작업은 함수로 빼면 build 메서드가 훨씬 짧아집니다.
Flutter 코드에서는 함수를 직접 실행하는 경우와 위젯에 콜백으로 전달하는 경우를 구분해야 합니다. onPressed: save()는 즉시 실행이고, onPressed: save는 나중에 실행될 함수를 전달하는 형태입니다.
코드
예제
// TextFormField의 validator에 넣을 수 있는 함수입니다.
// 오류가 있으면 String 메시지를 반환하고, 문제가 없으면 null을 반환합니다.
String? validateLessonTitle(String? value) {
// 사용자가 공백만 입력했을 수도 있으므로 trim으로 앞뒤 공백을 제거합니다.
final text = value?.trim() ?? '';
// 입력이 비어 있으면 폼 아래에 표시할 오류 문구를 반환합니다.
if (text.isEmpty) return '제목을 입력하세요.';
// 너무 짧은 제목도 별도 메시지로 안내합니다.
if (text.length < 2) return '제목은 두 글자 이상이어야 합니다.';
// null은 "검증 통과"라는 뜻입니다.
return null;
}
// named parameter를 사용하면 minutes와 compact의 의미가 호출부에서 잘 보입니다.
String formatDuration({required int minutes, bool compact = false}) {
// compact가 true면 짧은 표기를 반환합니다.
if (compact) return '${minutes}m';
// 기본값은 한국어 설명형 문구입니다.
return '$minutes분 학습';
}
// 함수를 인자로 받는 예제입니다. onSuccess는 나중에 실행할 콜백입니다.
void submit({
required String title,
required void Function(String message) onSuccess,
}) {
// 저장이 끝났다고 가정하고 성공 콜백을 실행합니다.
onSuccess('저장 완료: $title');
}
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: const Color(0xFFDCE6EF)),
borderRadius: BorderRadius.circular(8),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
decoration: BoxDecoration(
color: const Color(0xFFEEF7FB),
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'강의 제목',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w900),
),
),
Wrap(
spacing: 8,
runSpacing: 8,
children: [
Chip(label: Text('입력 대기')),
Chip(label: Text('검증'))
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('제목을 입력하세요'),
Text('저장 버튼 비활성화')
],
)
],
),
)
주의 사항
실무에서 확인할 점
- 함수가 너무 많은 일을 한다면 검증, 변환, 저장처럼 역할별로 나누세요.
- Flutter 콜백은 void Function(...) 형태를 자주 사용합니다.
- named parameter는 인자가 많아질수록 호출부를 읽기 쉽게 만듭니다.
다음 단계
실습 체크리스트
- 출처세부 기준과 최신 변경 사항을 확인할 수 있습니다.
- Flutter API Reference클래스, 메서드, 생성자 세부 정의를 확인합니다.
- Dart languageDart 문법 자체가 궁금할 때 함께 봅니다.