사용자와의 상호작용은 어떤 앱에서도 중요한 부분이며, Flutter에서는 다양한 Input Widget을 통해 이를 손쉽게 구현할 수 있습니다.
이번 포스팅에서는 Flutter의 주요 Input Widget들에 대해 자세히 알아보겠습니다.

Input Widget 개요
Input Widget은 사용자로부터 데이터를 입력받는 데 사용됩니다.
텍스트 입력, 스위치, 체크박스 등 다양한 방법을 제공하여 사용자의 선택이나 입력을 받을 수 있습니다.
주요 Input Widget
TextField
개요
텍스트 입력을 받기 위한 기본적인 Widget입니다.
속성
- controller:
TextEditingController
를 통해 텍스트 필드의 현재 텍스트를 관리할 수 있습니다. - keyboardType: 텍스트 필드에 표시될 키보드 타입을 지정합니다.
TextInputType
을 사용할 수 있습니다. - obscureText: 비밀번호 등 개인정보를 입력받을 때 텍스트를 가리기 위해 사용합니다.
이 값을true
로 설정하면, 입력된 텍스트가 별표(*)나 점(.)으로 표시됩니다. - onChanged: 텍스트 필드의 내용이 변경될 때마다 호출될 콜백 함수를 설정합니다.
사용자 입력을 실시간으로 처리하고 싶을 때 유용합니다.
예제
TextField의 입력된 값은 final myController = TextEditingController();
에 의해 생성된 TextEditingController에 의해 관리됩니다.
(전체 코드는 My Git Repository를 확인해주세요.)
TextField( controller: myController, decoration: const InputDecoration( border: OutlineInputBorder(), labelText: 'Put your text here', ), keyboardType: TextInputType.text, obscureText: false, onChanged: (text) { print("text field is changed: $text"); }, ),
결과

Checkbox
개요
사용자가 항목을 선택할 수 있게 하는 체크박스입니다.
속성
- value (bool?): 체크박스의 현재 상태를 나타냅니다. 이 속성은
null
도 될 수 있습니다. - onChanged (ValueChanged<bool?>?): 체크박스의 상태가 변경될 때 호출되는 콜백 함수입니다.
- activeColor (Color?): 체크박스가 체크된 상태일 때의 색상을 지정합니다.
- checkColor (Color?): 체크 표시의 색상을 지정합니다.
- focusColor (Color?): 체크박스가 포커스를 받았을 때의 배경 색상을 지정합니다.
- hoverColor (Color?): 마우스 포인터가 위에 올라갔을 때 체크박스의 배경 색상을 지정합니다.
- materialTapTargetSize (MaterialTapTargetSize?): 체크박스의 탭 가능 영역의 크기를 지정합니다.
- tristate (bool): 체크박스가 세 가지 상태를 가질 수 있게 할 것인지를 결정합니다. 기본값은
false
이며, 이 경우 체크박스는 두 가지 상태(체크됨/체크되지 않음)만 가집니다.true
로 설정하면 null 상태도 허용되어 체크박스가 ‘불확실’ 또는 ‘부분적’ 상태를 표현할 수 있습니다. - mouseCursor (MouseCursor?): 마우스 포인터가 체크박스 위에 있을 때 표시될 커서의 스타일을 지정합니다.
예제
bool 타입의 isChecked
값을 업데이트 합니다.
isChecked
상태에 따른 상태 값을 Text로 표시합니다.
Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Checkbox( value: isChecked, onChanged: (bool? value) { // Update Check State setState(() { isChecked = value!; }); }, ), Text(isChecked ? 'Checked' : 'Unchecked'), ], ),
결과

Radio
개요
사용자가 여러 옵션 중 하나를 선택할 수 있게 하는 라디오 버튼입니다.
속성
- value (T): 이 라디오 버튼의 값입니다.
사용자가 이 라디오 버튼을 선택하면, 이 값이groupValue
와 일치하게 됩니다. - groupValue (T?): 현재 그룹에서 선택된 라디오 버튼의 값을 나타냅니다.
value
와groupValue
가 같을 때, 해당 라디오 버튼은 선택된 것으로 표시됩니다. - onChanged (ValueChanged<T?>?): 라디오 버튼의 값이 변경될 때 호출되는 콜백 함수입니다.
만약 이 함수가null
로 설정되면, 라디오 버튼은 비활성화됩니다. - activeColor (Color?): 라디오 버튼이 선택될 때의 색상을 지정합니다.
- fillColor (MaterialStateProperty<Color?>?): 라디오 버튼의 채워진 부분의 색상을 지정합니다.
- materialTapTargetSize (MaterialTapTargetSize?): 라디오 버튼의 탭 가능 영역의 크기를 지정합니다.
- visualDensity (VisualDensity?): 위젯의 시각적 밀도를 조정합니다. 이 속성을 사용하여 라디오 버튼의 크기와 공간을 조절할 수 있습니다.
- focusColor (Color?): 라디오 버튼이 포커스를 받았을 때의 색상을 지정합니다.
- hoverColor (Color?): 마우스 포인터가 위에 올라갔을 때 라디오 버튼의 배경 색상을 지정합니다.
- overlayColor (MaterialStateProperty<Color?>?): 라디오 버튼을 눌렀을 때 나타나는 잉크 스플래시의 색상을 지정합니다.
- splashRadius (double?): 잉크 스플래시의 반경을 지정합니다. 이 값은 라디오 버튼을 눌렀을 때 나타나는 효과의 크기를 결정합니다.
예제
_setSelectedRadioValue()
는 다음과 같이 구현되어 있습니다.
void _setSelectedRadioValue(int? value) { setState(() { _selectedRadioValue = value!; }); }
3가지 옵션을 Radio 버튼을 통해 선택할 수 있습니다.
Column( children: <Widget>[ ListTile( title: const Text('Option 1'), leading: Radio( value: 1, groupValue: _selectedRadioValue, onChanged: _setSelectedRadioValue, ), ), ListTile( title: const Text('Option 2'), leading: Radio( value: 2, groupValue: _selectedRadioValue, onChanged: _setSelectedRadioValue, ), ), ListTile( title: const Text('Option 3'), leading: Radio( value: 3, groupValue: _selectedRadioValue, onChanged: _setSelectedRadioValue, ), ), // Display the selected option Text('Selected Option: $_selectedRadioValue'), ], ),
결과

Slider
개요
사용자가 주어진 범위 안에서 값을 선택할 수 있게 하는 슬라이더입니다.
속성
- value (double): 슬라이더의 현재 값을 나타냅니다. 이 값은
min
과max
사이에서 설정해야 합니다. - onChanged (ValueChanged<double>?): 슬라이더의 값을 변경할 때 호출되는 콜백 함수입니다.
- min (double): 슬라이더의 최소값을 정의합니다. 기본값은 0.0입니다.
- max (double): 슬라이더의 최대값을 정의합니다. 기본값은 1.0입니다.
- divisions (int?): 슬라이더를 몇 개의 동등한 부분으로 나눌지 정의합니다.
- label (String?): 현재 선택된 값의 레이블을 표시합니다.
- activeColor (Color?): 활성화된 슬라이더의 색상을 지정합니다. 사용자가 선택한 부분의 색상을 나타냅니다.
- inactiveColor (Color?): 비활성화된 슬라이더의 색상을 지정합니다. 사용자가 아직 선택하지 않은 부분의 색상을 나타냅니다.
- thumbColor (Color?): 슬라이더의 조절점(Thumb)의 색상을 지정합니다.
- overlayColor (Color?): 사용자가 조절점을 누르고 있을 때 나타나는 색상의 오버레이를 정의합니다.
- trackHeight (double?): 슬라이더 트랙의 높이를 지정합니다.
- mouseCursor (MouseCursor?): 마우스 커서가 슬라이더 위에 있을 때 표시할 커서의 스타일을 지정합니다.
- focusNode (FocusNode?): 슬라이더에 포커스를 관리할
FocusNode
를 할당합니다. - autofocus (bool): 슬라이더가 화면에 표시될 때 자동으로 포커스를 받을지 여부를 결정합니다.
예제
0에서 100 사이의 값을 선택할 수 있는 Slider
위젯을 구현합니다.
슬라이더는 5개의 구분점을 가지며, 사용자가 슬라이더를 움직일 때마다 _currentSliderValue
가 업데이트되어 현재 선택된 값을 화면에 표시합니다.
Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Slider( value: _currentSliderValue, min: 0, max: 100, divisions: 5, label: _currentSliderValue.round().toString(), onChanged: (double value) { setState(() { _currentSliderValue = value; }); }, ), Text('Current value: ${_currentSliderValue.round()}'), ], ),
결과

참고 링크
My Repository (_2_widgets_basic)
Flutter 공식 문서 – Building user interfaces with Flutter
LogRocket Blog – Widgets: The building blocks of Flutter apps