플러터에서 date picker를 기본 제공해 주고 있다.

정확히 말하면 flutter/material.dart에 showDatePicker함수가 

datepicker를 구현한다.

 

아래는 플러터사이트의 튜터리얼에 있는 사용법이다.

Future<DateTime> selectedDate = showDatePicker(
  context: context,
  initialDate: DateTime.now(),
  firstDate: DateTime(2018),
  lastDate: DateTime(2030),
  builder: (BuildContext context, Widget child) {
    return Theme(
      data: ThemeData.dark(),
      child: child,
    );
  },
);

 

이를 조금더 사용하기 쉽게 사용자 함수로 아래와 같이 만들었다.

return 값을 받는게 목적이다.

  Future selectDate() async {
    DateTime picked = await showDatePicker(
        context: context,
        locale: const Locale('ko', 'KO'),
        initialDate: DateTime.now(),
        firstDate: DateTime(2015),
        lastDate: DateTime(2030),
        builder: (BuildContext context, Widget child) {
          return Theme(
            data: ThemeData.dark(),
            child: child,
          );
        },
    );
    if(picked != null) {
      return picked.toString().substring(0, 10 );
    } else {
      return null;
    }
  }

 

버튼에 이벤트를 달아 실행하니

아래와 같은 에러가 발생했다.

 

 

 

에러 문구

The following NoSuchMethodError was thrown building Directionality(textDirection: ltr):
The method 'formatFullDate' was called on null.
Receiver: null
Tried calling: formatFullDate(Instance of 'DateTime')

 

formatFullDate라는 함수를 호출하면서 null 에러가 발생한것이다.

 

구글링 결과

국제 지역화 정보를 사용한다는 것을 셋팅하여야 한다는 것이다.

 

첫번째는 pubspec.yaml에서 페키지를 dependency 하고

main.dart에서 MateralApp에 localizationsDelegates 와 supportedLocales를 설정해 주면된다.

 

pubspec.yaml

  # lcalizations package
  flutter_localizations:
    sdk: flutter

 

main.dart

      child: MaterialApp(
          title: 'TEST APP',
          localizationsDelegates: [
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
          ],
          supportedLocales: [
            const Locale('en', 'US'),
            const Locale('ko', 'KO'),
          ],

 

에뮬레이터 재시작을 하니 아주 예쁘게 달력이 출력된다.

 

 

테스트 결과 supportedLocales는 설정하지 않아도 달력이 정상적으로 출력된다.

한가지 아쉬운것은 달만 선택가능하는 기능을 제공하지 않는것이다.

 

요런  jquery 달력인 datepicker를 사용하고 있었다.




<!doctype html>

<html lang="en">

 <head>

  <meta charset="UTF-8">

  <title>datepicker</title>

  <link rel="stylesheet" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

  <script src="https://code.jquery.com/jquery-1.7.2.js"></script>

  <script src="https://code.jquery.com/ui/1.9.1/jquery-ui.js"></script>

<script type="text/javascript">

$( function() {

var options = {

showOn : 'button'

, buttonImage : 'https://jqueryui.com/resources/demos/datepicker/images/calendar.gif'

, buttonText : '날자선택'

, buttonImageOnly : true

, showMonthAfterYear : true

, changeYear : true

, changeMonth : true

, dateFormat : 'yy-mm-dd'

, monthNamesShort : ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] // 월의 한글 형식.

, dayNamesMin : ['일','월','화','수','목','금','토']

};

    $(".datepicker").datepicker(options);

});

</script>

 </head>

 <body>

<input type="text" class="datepicker" id="date1">

~

<input type="text" class="datepicker" id="date2">

 </body>

</html>



퍼블리셔 분이 datepicker에 대한 수정을 요청하셨다. 웹접근성에 맞게 작동해야 한다는 것이다.


날짜 input안에서 탭을 하면 달력 이미지로 포커스가 가고 거기서 앤터를 치면 달력이 펼쳐져야 된다는 것이다.


현재소스에서는 input 옆에 버튼이 생기지만 이미지만 있어서 그쪽으로는 포커스가 가질 않는다.


그래서 엄청난 삽질을 했다.


datepicker를 통제하기 위해 무지막지한 스크립트를 덕지덕지 붙이기 시작했다.


그러던 중 buttonImageOnly 라는 속성이 뭐지... false로 주면 어떻게 되나...

false로 설정하고 새로 고침을 하니...


button이 생성되고 이미지가 button안에 BG로 보이는 것이다.


역시... tutorial을 제대로 읽어야 한다.


그래야 고생을 안한다.


buttonImageOnly : false


요것만 바꿔주면 된다.. 




+ Recent posts