Flutter 사용자 입력 처리와 이벤트 동작
2025. 1. 21. 18:19ㆍ같이 공부합시다 - Flutter/Flutter 기본기
728x90
반응형
1. TextField 위젯 (사용자 입력 받기)
TextField는 사용자가 글자를 입력할 수 있는 상자입니다.
아래는 간단한 예제입니다:
TextField(
decoration: InputDecoration(
labelText: '이름을 입력하세요', // 상자 안에 표시될 텍스트
border: OutlineInputBorder(), // 상자 테두리 추가
),
onChanged: (value) {
print('입력된 값: $value'); // 사용자가 입력할 때마다 값 출력
},
)
쉽게 이해하기:
- labelText: 입력 상자 위에 "이름을 입력하세요"라는 안내 문구가 표시됩니다.
- onChanged: 사용자가 글자를 입력할 때마다 입력한 값이 출력됩니다.
- TextField의 decoration은 입력 상자를 꾸미는 역할을 합니다. 주로 안내 텍스트, 테두리, 아이콘, 여백 등을 설정할 수 있습니다.
다양한 속성을 갖고 있죠.
TextField(
decoration: InputDecoration(
labelText: '아이디', // 입력 상자 위 안내문
hintText: '아이디를 입력해주세요', // 상자 안 힌트
border: OutlineInputBorder(), // 테두리 추가
prefixIcon: Icon(Icons.person), // 입력 상자 앞에 아이콘 추가
suffixIcon: Icon(Icons.check), // 입력 상자 뒤에 아이콘 추가
filled: true, // 배경색 활성화
fillColor: Colors.grey[200], // 배경색 설정
),
)
2. ElevatedButton과 TextField 연동 (입력 값 사용하기)
이제 TextField와 ElevatedButton을 조합해 봅시다.
- 사용자가 이름을 입력하고, 버튼을 눌렀을 때 입력 값을 출력하는 예제입니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('사용자 입력 예제'),
),
body: InputExample(),
),
);
}
}
class InputExample extends StatefulWidget {
@override
_InputExampleState createState() => _InputExampleState();
}
class _InputExampleState extends State<InputExample> {
String inputText = ''; // 입력 값을 저장할 변수
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(16.0), // 화면 여백
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
decoration: InputDecoration(
labelText: '이름을 입력하세요',
border: OutlineInputBorder(),
),
onChanged: (value) {
setState(() {
inputText = value; // 입력 값을 변수에 저장
});
},
),
SizedBox(height: 20), // 간격 추가
ElevatedButton(
onPressed: () {
print('입력된 이름: $inputText');
},
child: Text('확인'),
),
],
),
);
}
}
쉽게 이해하기:
- TextField: 사용자가 이름을 입력합니다.
- onChanged: 입력 값이 변경될 때마다 inputText 변수에 저장됩니다.
- ElevatedButton: 버튼을 누르면 inputText에 저장된 값이 출력됩니다.
자세하게 이해하기:
이 Flutter 코드의 동작과 구성을 초보자가 이해하기 쉽게 단계별로 설명하겠습니다.
1. 전체 앱 구조
- MyApp은 앱의 시작점입니다. main 에서 호출했죠? ㅇㅋ
- MaterialApp: Flutter에서 앱을 만드는 기본 틀입니다.
- home: 앱의 첫 화면을 지정합니다. 여기서는 Scaffold를 사용했습니다.
2. Scaffold 구성
- Scaffold: 화면을 구성하는 기본적인 틀입니다. 뼈대죠!
- appBar: 화면 상단의 제목 부분입니다. 나중엔 자주 삭제하게 되는 것 같아요.
- title: Text('사용자 입력 예제'): "사용자 입력 예제"라는 제목이 표시됩니다.
- body: 앱의 주요 내용이 들어가는 부분입니다.
- InputExample 위젯이 표시됩니다. 이 위젯은 제가 임의로 만든거죠. 제공되는 위젯 아님.
- appBar: 화면 상단의 제목 부분입니다. 나중엔 자주 삭제하게 되는 것 같아요.
InputExample 위젯 설명
1. StatefulWidget 사용
- InputExample은 StatefulWidget !!
- 화면에서 사용자 입력 값을 받아서 변화가 있을 때 새로 그리기 위해 사용됩니다.
- StatefulWidget은 상태를 저장하고, setState()로 상태가 변경되면 화면을 업데이트합니다. setState 는 중요합니다. 빼먹지 맙시다..
InputExample 내부 동작
1. 변수 선언
String inputText = ''; // 입력 값을 저장할 변수
- 사용자가 입력한 내용을 저장하는 변수입니다.
- 초기에 빈 문자열로 설정되어 있습니다.
2. Padding 위젯
Padding(
padding: EdgeInsets.all(16.0), // 화면 여백 설정
child: ...
)
- 화면 양쪽에 여백을 추가합니다.
- EdgeInsets.all(16.0): 모든 방향(위, 아래, 왼쪽, 오른쪽)에 16픽셀의 여백을 줍니다.
3. Column 위젯
Column(
mainAxisAlignment: MainAxisAlignment.center, // 세로로 가운데 정렬
children: [
...
],
)
- 화면을 세로로 구성하기 위해 Column 위젯을 사용합니다.
- mainAxisAlignment: MainAxisAlignment.center
- 위젯들을 화면의 세로 가운데에 정렬합니다.
- children: Column 안에 들어갈 위젯들을 나열합니다.
4. TextField (사용자 입력 상자)
TextField(
decoration: InputDecoration(
labelText: '이름을 입력하세요', // 입력 상자 위 안내문
border: OutlineInputBorder(), // 테두리 추가
),
onChanged: (value) {
setState(() {
inputText = value; // 입력된 값을 변수에 저장
});
},
)
- TextField는 사용자가 글자를 입력할 수 있는 상자입니다.
- decoration: 입력 상자를 꾸미는 설정입니다. 위에서 설명했쥬?
- labelText: 입력 상자 위에 "이름을 입력하세요"라는 안내문을 표시합니다.
- border: 입력 상자에 테두리를 추가합니다.
- onChanged:
- 사용자가 글자를 입력할 때마다 호출됩니다. 이거 좋습니다!
- 입력된 값을 inputText 변수에 저장합니다.
- setState(): 화면을 다시 그려서 inputText의 최신 값을 반영합니다.
5. SizedBox (간격 추가)
SizedBox(height: 20)
- 위젯들 사이에 20픽셀 간격을 추가합니다.
- 간단한 예: TextField와 버튼 사이에 여백을 만들어 줍니다.
6. ElevatedButton (클릭 가능한 버튼)
ElevatedButton(
onPressed: () {
print('입력된 이름: $inputText');
},
child: Text('확인'),
)
- 사용자가 클릭할 수 있는 버튼입니다.
- onPressed: 버튼이 눌렸을 때 실행될 동작을 정의합니다.
- 여기서는 print()를 사용해 입력된 이름을 출력합니다.
- 예: 사용자가 "홍길동"을 입력하면, 터미널에 입력된 이름: 홍길동이 표시됩니다.
- child: 버튼에 표시될 내용을 정의합니다.
- 여기서는 "확인"이라는 텍스트가 버튼 안에 표시됩니다.
전체 흐름
- 앱 실행 시, 화면에는 입력 상자(TextField)와 확인 버튼(ElevatedButton)이 세로로 나란히 표시됩니다.
- 사용자가 이름을 입력하면:
- 입력된 내용이 onChanged를 통해 inputText 변수에 저장됩니다.
- 사용자가 "확인" 버튼을 누르면:
- 버튼의 onPressed 이벤트가 실행됩니다.
- 입력된 이름이 터미널에 출력됩니다.
화면 구성 요약
- 상단에 제목: "사용자 입력 예제"
- 가운데에 입력 상자: 이름을 입력할 수 있음
- 그 아래에 확인 버튼: 버튼 클릭 시 입력된 이름 출력
3. 이벤트로 화면에 출력하기
이제 입력 값을 터미널이 아닌 화면에 표시해 보겠습니다.
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('입력값 화면 출력'),
),
body: InputDisplayExample(),
),
);
}
}
class InputDisplayExample extends StatefulWidget {
@override
_InputDisplayExampleState createState() => _InputDisplayExampleState();
}
class _InputDisplayExampleState extends State<InputDisplayExample> {
String inputText = ''; // 입력 값을 저장할 변수
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
decoration: InputDecoration(
labelText: '메시지를 입력하세요',
border: OutlineInputBorder(),
),
onChanged: (value) {
setState(() {
inputText = value; // 입력 값을 변수에 저장
});
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
setState(() {
// 버튼을 눌렀을 때만 화면에 값을 출력
});
},
child: Text('화면에 출력'),
),
SizedBox(height: 20),
Text(
'입력된 메시지: $inputText',
style: TextStyle(fontSize: 18, color: Colors.blue),
),
],
),
);
}
}
쉽게 이해하기:
- TextField: 입력 상자에서 글자를 입력합니다.
- Text 위젯: 입력된 메시지를 화면에 보여줍니다.
- ElevatedButton: 버튼을 눌렀을 때 값이 화면에 즉시 반영됩니다.
4. 주요 개념 요약
- TextField: 사용자 입력을 받을 수 있는 상자
- onChanged: 사용자가 글자를 입력할 때 호출되는 함수
- setState: 화면을 다시 그리도록 요청하는 함수
- ElevatedButton: 클릭 이벤트를 처리하는 버튼
5. 다음 학습 내용
다음 단계에서는 조건문을 활용한 입력 값 검증과 간단한 폼 만들기를 공부해 보겠습니다.
오늘도 고생하셨습니다. 끝!
728x90
반응형
'같이 공부합시다 - Flutter > Flutter 기본기' 카테고리의 다른 글
Flutter 화면 구성하기: 레이아웃 기본 배우기 (Column , Row 위젯!) (3) | 2025.01.20 |
---|---|
[Flutter 기초] 텍스트 꾸미기: 색깔, 크기, 굵기 완벽 이해 (TextStyle 클래스) (1) | 2025.01.17 |
Flutter 버튼 쉽게 배우기: 클릭으로 시작하는 앱 개발 (ElevatedButton, StatefulWidget 예제) (15) | 2025.01.16 |
모든 개발의 시작. Flutter 에서도 Hello World ! (28) | 2025.01.15 |
Flutter를 선택한 이유와 초심 찾기: 스테디빌더의 개발 이야기 (16) | 2025.01.14 |