본문 바로가기
개발일지/GoodWishes

[굿위시 제작기] 8. 굿즈 추가 페이지 제작과정 - DatePicker 사용하기

by 박기린 2024. 10. 17.

 


굿즈 날짜 기록 state

굿즈 추가 페이지의 state 중에는 date가 있습니다.

굿즈를 획득한 시점을 기록하는 부분입니다. 

 

Flutter에서는 날짜에 대해 DateTime이라는 class를 제공하고 있습니다.

덕분에 쉽게 날짜를 출력할 수 있지만, 유저가 직접 날짜를 지정하는 기능을 만들 필요가 있습니다.

 

 

 

 


DatePicker 위젯

[굿즈 추가 페이지 소스코드 주소 : https://arnopark.tistory.com/917#%EC%84%A0%ED%83%9D%EC%A7%80-%EC%A0%95%EB%8B%B5-2]

 

 

 

 

위젯 중에는 굿즈 구매 일자를 등록할 수 있는 항목이 있습니다.

AddGoodsListEl 위젯은 leftText, rightWidget을 전달받는데, rigthWidget에 DatePicker라는 위젯을 전달합니다.

DatePicker 위젯은 왼쪽 사진의 빨간 네모 안에서, 날짜를 나타내는 부분입니다.

 

이 부분을 클릭하면, flutter가 제공하는 showDatePicker()함수가 실행되면서, DatePicker 팝업이 뜹니다.

 

 

 

 


DatePicker 위젯의 소스코드

import 'package:flutter/material.dart';

class DatePicker extends StatefulWidget {
  const DatePicker({
    super.key,
    required this.callback,
    this.initVal,
  });
  final Function callback;
  final String? initVal;

  @override
  State<DatePicker> createState() => _DatePickerState();
}

class _DatePickerState extends State<DatePicker> {
  late DateTime date;

  @override
  void initState() {
    super.initState();
    if (widget.initVal != null) {
      date = DateTime.parse(widget.initVal!);
    } else {
      date = DateTime.now();
    }
  }

  @override
  Widget build(BuildContext context) {
    return TextButton(
      style: ButtonStyle(
        padding: WidgetStateProperty.all<EdgeInsets>(EdgeInsets.zero),
        minimumSize: WidgetStateProperty.all<Size>(Size.zero),
        tapTargetSize: MaterialTapTargetSize.shrinkWrap,
      ),
      onPressed: () async {
        final selectedDate = await showDatePicker(
          context: context,
          initialDate: date,
          firstDate: DateTime(2000),
          lastDate: DateTime.now(),
        );
        if (selectedDate != null) {
          setState(() {
            date = selectedDate;
          });
          widget.callback(date);
        }
      },
      child: Text(
        "${date.year.toString()}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}",
        style: const TextStyle(
          color: Colors.black,
          fontSize: 17,
        ),
      ),
    );
  }
}

 

 

 

 


DatePicker 위젯의 소스코드 분석

DatePicker는 콜백함수와 initVal을 전달받습니다.

callback : 콜백함수를 통해, 상위 위젯인 굿즈 추가 페이지로 날짜 정보를 전달합니다.
initVal : initVal은 굿즈의 날짜 초기값을 의미합니다. 나중에 굿즈를 수정할 경우, 사전에 설정된 날짜를 불러오는 역할을 담당합니다.

 

 

 

 

DatePicker는 stateful위젯으로, initState()를 사용할 수 있습니다.

 

Flutter에서 기본 제공하는 DateTime 클래스의 인스턴스인 'date'를 state로 지정합니다.

initState() 과정에서, 만약 initVal을 전달받는다면 '사전 설정된 날짜'를, 그렇지 않다면(굿즈를 신규로 추가하는 경우라면) '오늘 날짜'를 date state에 저장합니다.

 

 

 

 

 

이제 DatePicker 팝업을 열어줄 버튼을 만들 차례입니다.

TextButton 위젯을 통해, 날짜 부분을 누르면 DatePicker가 뜰 수 있게 합니다.

 

 

 

 

onPressed를 설정합니다.

비동기 함수를 이용해서, showDatePicker()를 실행하고 날짜를 전달받는 기능을 구현합니다.

 

showDatePicker
initialDate : DatePicker가 켜지자마자 초기에 지정될 날짜입니다. 아까 설정한 date state를 전달합니다.
firstDate : 날짜를 2000년부터 설정할 수 있게 합니다.

lastDate : 날짜를 '오늘'까지 지정할 수 있게 합니다.

 

 

 

 

Flutter에서 지원하는 showDatePicker는 공식문서를 참고해서 이용하면 좋습니다.

showDatePicker 공식문서 : https://api.flutter.dev/flutter/material/showDatePicker.html

 

 

 

 

 

마지막으로, TextButton()의 child로 Text() 위젯을 전달합니다.

Text() 위젯은 현재 설정된 날짜를 출력하는 기능을 담당합니다.

 

 

 

 


날짜 설정 작동 확인하기

구매 일자 옆의 날짜를 눌러서 DatePicker를 킵니다.

작성일자인 2024년 10월 17일에서, 2024년 10월 1일을 선택한 후 ok 버튼을 누릅니다.

변경된 날짜가 출력되는 것을 확인합니다.

 

 

 

반응형