플러터 DatePicker iOS 스타일 (Cupertino) 사용법 및 예제

Flutter 개발에 있어서 Cupertino 위젯은 iOS 사용자에게 친숙한 인터페이스를 제공하는 데 핵심적인 역할을 합니다. 그중에서도 플러터 DatePicker는 날짜 및 시간을 선택하는 UI 컴포넌트로, iOS 스타일의 플리커를 통해 날짜와 시간을 선택할 수 있게 해줍니다. 이 글에서는 Cupertino의 개념부터 시작하여, CupertinoDatePicker의 사용법과 사용자 정의 값 추출 방법에 대해서 설명드리겠습니다.

Cupertino란?

Cupertino 위젯은 Flutter에서 iOS 스타일의 디자인을 구현할 수 있도록 해주는 위젯 모음입니다. 이름 자체가 애플 본사가 위치한 캘리포니아주 Cupertino에서 유래되었으며, iOS의 시각적 요소와 상호작용을 Flutter 앱 안에서 재현할 수 있게 해줍니다. Cupertino 위젯을 사용하면, 앱이 iOS 디바이스에서 네이티브 앱처럼 느껴지도록 만들 수 있습니다.

CupertinoDatePicker 예제

CupertinoDatePicker를 사용하기 위해서는 먼저 flutter/cupertino.dart를 임포트해야 합니다. 기본적인 CupertinoDatePicker 위젯의 사용법은 다음 예제 코드를 통해 확인할 수 있습니다.

기본 설정

먼저, iOS 스타일의 위젯을 사용하기 위해 cupertino.dart 패키지를 임포트합니다. 그리고 앱의 메인 함수에서 MyApp 클래스를 실행합니다. MyApp 클래스는 StatelessWidget을 상속받으며, CupertinoDatePickerExample 위젯을 홈으로 설정합니다.

// Flutter 프레임워크에서 기본적인 UI 요소를 사용하기 위해 material.dart 패키지를 임포트합니다.
import 'package:flutter/material.dart';
// iOS 스타일의 위젯을 사용하기 위해 cupertino.dart 패키지를 임포트합니다.
import 'package:flutter/cupertino.dart';

// 애플리케이션의 시작점입니다.
void main() => runApp(MyApp());

// 이 클래스는 애플리케이션의 루트 위젯 역할을 합니다.
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // MaterialApp 위젯을 반환합니다. 이는 Material 디자인을 적용한 앱의 루트입니다.
    return MaterialApp(
      // home 프로퍼티에 CupertinoDatePickerExample() 위젯을 지정하여,
      home: CupertinoDatePickerExample(),
    );
  }
}

StatefulWidget 상속

Flutter에서 Cupertino 스타일의 날짜 및 시간 선택기를 구현하기 위해 StatefulWidget을 사용합니다. StatefulWidget을 사용하는 이유는 선택된 날짜와 시간을 사용자가 변경할 수 있게 하여, 이 변경사항을 화면에 동적으로 반영하기 위해서 입니다.

class CupertinoDatePickerExample extends StatefulWidget {
   // createState 메소드를 오버라이드하여, 위젯의 상태를 관리할 클래스의 인스턴스를 생성합니다.
  // _CupertinoDatePickerExampleState 클래스의 인스턴스를 반환합니다.
  @override
  _CupertinoDatePickerExampleState createState() =>
      _CupertinoDatePickerExampleState();
}

위젯 구성

CupertinoPageScaffold를 사용하여 앱의 레이아웃을 구성합니다. 중앙에는 사용자가 날짜와 시간을 선택할 수 있는 CupertinoDatePicker 위젯을 배치합니다. CupertinoDatePicker의 initialDateTime, onDateTimeChanged, mode, use24hFormat, minimumYear, maximumYear 등의 속성을 설정하여 위젯의 동작을 커스터마이즈할 수 있습니다. 사용자가 선택한 날짜와 시간은 Text 위젯을 통해 화면에 표시됩니다.

class _CupertinoDatePickerExampleState
    extends State<CupertinoDatePickerExample> {
  // 선택된 날짜 및 시간을 저장할 변수를 선언합니다. 초기값으로 현재 날짜와 시간을 설정할 수 있습니다.
  DateTime date = DateTime.now();

  // 새로운 날짜와 시간을 date 변수에 저장하고, 상태를 업데이트하기 위해 setState를 호출합니다.
  void _onDateTimeChanged(DateTime newDate) {
    setState(() {
      date = newDate;
    });
  }

  @override
  Widget build(BuildContext context) {
    // CupertinoPageScaffold를 사용하여 iOS 스타일의 페이지 레이아웃을 구성합니다.
    return CupertinoPageScaffold(
      // 상단 네비게이션 바 설정. 중앙에 텍스트를 배치합니다.
      navigationBar: CupertinoNavigationBar(
        middle: Text('CupertinoDatePicker 예제'),
      ),
      // 페이지의 중앙에 자식 위젯들을 배치합니다.
      child: Center(
        // 세로로 위젯들을 나열하기 위한 Column 위젯 사용.
        child: Column(
          // Column의 주축 크기를 최소화합니다.
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            // CupertinoDatePicker를 포함하는 Container. 높이는 200으로 설정.
            Container(
              height: 200,
              // 날짜 및 시간을 선택할 수 있는 CupertinoDatePicker 위젯.
              child: CupertinoDatePicker(
                // 초기에 선택된 날짜와 시간.
                initialDateTime: date,
                // 날짜나 시간이 변경될 때 호출되는 콜백 함수.
                onDateTimeChanged: _onDateTimeChanged,
                // 날짜와 시간을 모두 선택할 수 있도록 설정.
                mode: CupertinoDatePickerMode.dateAndTime,
                // 24시간 형식을 사용하도록 설정.
                use24hFormat: true,
                // 선택 가능한 최소 연도 설정.
                minimumYear: 2010,
                // 선택 가능한 최대 연도를 현재 연도로 설정.
                maximumYear: DateTime.now().year,
              ),
            ),
            // 위젯 간의 간격을 두기 위한 SizedBox.
            SizedBox(height: 16),
            // 선택한 날짜와 시간을 표시하는 Text 위젯.
            Text(
              '선택한 날짜와 시간: ${date.toString()}',
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}
플러터-DatePicker

커스텀 값 가져오기

CupertinoPicker는 iOS 스타일의 스크롤 휠을 제공하여 사용자가 원하는 옵션을 선택할 수 있게 합니다. 본 예제에서는 두 개의 CupertinoPicker를 사용하여 사용자가 과일과 색상을 선택할 수 있도록 구성했습니다.

class _CupertinoDatePickerExampleState extends State<CupertinoDatePickerExample> {
  int selectedFruitIndex = 0; // 선택된 과일의 인덱스를 저장하는 변수
  int selectedColorIndex = 0; // 선택된 색상의 인덱스를 저장하는 변수
  final List<String> fruits = ['사과', '바나나', '체리', '딸기']; // 과일 목록
  final List<String> colors = ['빨강', '녹색', '파랑', '노랑']; // 색상 목록

  @override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(
        middle: Text('여러 데이터 선택 예제'), // 상단 네비게이션 바 제목
      ),
      child: SafeArea(
        child: Column(
          children: <Widget>[
            Expanded(
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Expanded(
                    // 첫 번째 CupertinoPicker 위젯: 과일 선택
                    child: CupertinoPicker(
                      itemExtent: 32.0, // 각 항목의 높이
                      onSelectedItemChanged: (int index) {
                        setState(() {
                          selectedFruitIndex = index; // 사용자가 과일을 선택할 때 선택된 인덱스 업데이트
                        });
                      },
                      children: List<Widget>.generate(fruits.length, (int index) {
                        return Center(child: Text(fruits[index])); // 과일 목록에서 항목 생성
                      }),
                    ),
                  ),
                  Expanded(
                    // 두 번째 CupertinoPicker 위젯: 색상 선택
                    child: CupertinoPicker(
                      itemExtent: 32.0, // 각 항목의 높이
                      onSelectedItemChanged: (int index) {
                        setState(() {
                          selectedColorIndex = index; // 사용자가 색상을 선택할 때 선택된 인덱스 업데이트
                        });
                      },
                      children: List<Widget>.generate(colors.length, (int index) {
                        return Center(child: Text(colors[index])); // 색상 목록에서 항목 생성
                      }),
                    ),
                  ),
                ],
              ),
            ),
            Container(
              padding: EdgeInsets.all(16),
              // 사용자가 선택한 과일과 색상을 텍스트로 표시
              child: Text(
                '선택한 과일: ${fruits[selectedFruitIndex]}, 선택한 색상: ${colors[selectedColorIndex]}',
                style: TextStyle(fontSize: 16),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

마무리

Flutter에서 CupertinoPicker를 사용하는 이 예제를 통해, 사용자로부터 다양한 입력을 받고, 그 값을 어떻게 커스텀하여 활용할 수 있는지를 알아보았습니다. 읽어주셔서 감사합니다.

Material디자인에서 DatePicker는 아래글에서 확인할수 있습니다.

Leave a Comment