패키지, 저장소 및 앱 카테고리 검색

omni_datetime_picker 표지
패키지 상세v2.3.3

omni_datetime_picker

단일 날짜 및 시간 선택기 또는 날짜 및 시간 범위 선택기를 사용할 수 있는 날짜 및 시간 선택기 패키지입니다.

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
4만
좋아요
265
Pub 점수
160

패키지 설치

flutter pub add omni_datetime_picker

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

OmniDateTimePicker는 단일 날짜 및 시간 선택기와 범위 선택기를 지원하는 유연한 날짜 및 시간 선택 기능을 제공하는 Flutter 패키지입니다. Android, iOS, Web, macOS, Windows, Linux에서 일관되고 사용자 정의 가능한 인터페이스를 제공합니다. 폼, 캘린더, 스케줄링 앱에서 날짜 및 시간 입력을 간소화하여 직관적인 UI 컴포넌트로 하나 또는 여러 날짜/시간을 선택할 수 있도록 합니다. Dart로 구현되어 Flutter 프로젝트에 원활하게 통합되며, 로컬라이제이션과 테마 커스터마이징을 지원합니다.

사용 사례

  • 예약 일정 조정
  • 예약 시스템
  • 이벤트 기획 도구
  • 날짜/시간이 필요한 폼 입력
  • 캘린더 애플리케이션
  • 작업 관리 인터페이스

주요 기능

  • 단일 날짜 및 시간 선택기
  • 범위 날짜 및 시간 선택기
  • 크로스 플랫폼 호환성
  • 사용자 정의 테마
  • 로컬라이제이션 지원
  • 부드러운 애니메이션

적합한 대상

  • 날짜/시간 입력을 포함한 폼을 개발하는 개발자
  • 유연한 날짜 선택이 필요한 앱
  • 다중 플랫폼을 대상으로 하는 프로젝트
  • 사용자 인터페이스 중심의 스케줄링 기능
  • 개발자 경험을 우선시하는 팀

고려 사항

  • Flutter SDK 2.5 이상이 필요합니다
  • 기본적인 날짜/시간 선택에 한정됨(고급 캘린더 로직 없음)
  • 복잡한 UI의 경우 추가적인 스타일링이 필요할 수 있습니다
  • 선택 외에는 내장 검증이 없습니다
  • 일부 기능은 플랫폼 전용 네이티브 컴포넌트에 의존합니다

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

Omni DateTime Picker

pub package

A DateTime picker that lets user select a date and the time, with start & end as a range.

ko-fi

Screenshots

Light Dark
Omni DateTime Range Picker - Light Omni DateTime Range Picker - Dark

Getting started

Add this to your package's pubspec.yaml file and run flutter pub get:

dependencies:
  omni_datetime_picker: ^2.3.2

Now in your Dart code, you can use:

import 'package:omni_datetime_picker/omni_datetime_picker.dart';

Usage

Simple usage:

OmniDateTimePicker

DateTime? dateTime = await showOmniDateTimePicker(context: context);

OmniDateTimeRangePicker

List<DateTime>? dateTimeList = await showOmniDateTimeRangePicker(context: context);

Custom properties:

OmniDateTimePicker

DateTime? dateTime = await showOmniDateTimePicker(
                    context: context,
                    initialDate: DateTime.now(),
                    firstDate:
                        DateTime(1600).subtract(const Duration(days: 3652)),
                    lastDate: DateTime.now().add(
                      const Duration(days: 3652),
                    ),
                    is24HourMode: false,
                    isShowSeconds: false,
                    minutesInterval: 1,
                    secondsInterval: 1,
                    isForce2Digits: false,
                    borderRadius: const BorderRadius.all(Radius.circular(16)),
                    constraints: const BoxConstraints(
                      maxWidth: 350,
                      maxHeight: 650,
                    ),
                    transitionBuilder: (context, anim1, anim2, child) {
                      return FadeTransition(
                        opacity: anim1.drive(
                          Tween(
                            begin: 0,
                            end: 1,
                          ),
                        ),
                        child: child,
                      );
                    },
                    transitionDuration: const Duration(milliseconds: 200),
                    barrierDismissible: true,
                    barrierColor: const Color(0x80000000),
                    selectableDayPredicate: (dateTime) {
                      // Disable 25th Feb 2023
                      if (dateTime == DateTime(2023, 2, 25)) {
                        return false;
                      } else {
                        return true;
                      }
                    },
                    type: OmniDateTimePickerType.dateAndTime,
                    title: Text('Select Date & Time'),
                    titleSeparator: Divider(),
                    separator: SizedBox(height: 16),
                    padding: EdgeInsets.all(16),
                    insetPadding: EdgeInsets.symmetric(horizontal: 40, vertical: 24),
                    theme: ThemeData.light(),
                    actionsBuilder: (context, confirmCallback, cancelCallback) {
                      return Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          TextButton(
                            onPressed: cancelCallback,
                            child: Text('Cancel'),
                          ),
                          ElevatedButton(
                            onPressed: confirmCallback,
                            child: Text('Confirm'),
                          ),
                        ],
                      );
                    },
                  );

OmniDateTimeRangePicker

List<DateTime>? dateTimeList =
                      await showOmniDateTimeRangePicker(
                    context: context,
                    startInitialDate: DateTime.now(),
                    startFirstDate:
                        DateTime(1600).subtract(const Duration(days: 3652)),
                    startLastDate: DateTime.now().add(
                      const Duration(days: 3652),
                    ),
                    endInitialDate: DateTime.now(),
                    endFirstDate:
                        DateTime(1600).subtract(const Duration(days: 3652)),
                    endLastDate: DateTime.now().add(
                      const Duration(days: 3652),
                    ),
                    is24HourMode: false,
                    isShowSeconds: false,
                    minutesInterval: 1,
                    secondsInterval: 1,
                    isForce2Digits: false,
                    isForceEndDateAfterStartDate: true,
                    onStartDateAfterEndDateError: () {
                      // Handle error when start date is after end date
                      print('Start date cannot be after end date!');
                    },
                    borderRadius: const BorderRadius.all(Radius.circular(16)),
                    constraints: const BoxConstraints(
                      maxWidth: 350,
                      maxHeight: 650,
                    ),
                    transitionBuilder: (context, anim1, anim2, child) {
                      return FadeTransition(
                        opacity: anim1.drive(
                          Tween(
                            begin: 0,
                            end: 1,
                          ),
                        ),
                        child: child,
                      );
                    },
                    transitionDuration: const Duration(milliseconds: 200),
                    barrierDismissible: true,
                    barrierColor: Colors.black54,
                    startSelectableDayPredicate: (dateTime) {
                      // Disable 25th Feb 2023 for start date
                      if (dateTime == DateTime(2023, 2, 25)) {
                        return false;
                      } else {
                        return true;
                      }
                    },
                    endSelectableDayPredicate: (dateTime) {
                      // Disable 26th Feb 2023 for end date
                      if (dateTime == DateTime(2023, 2, 26)) {
                        return false;
                      } else {
                        return true;
                      }
                    },
                    type: OmniDateTimePickerType.dateAndTime,
                    title: Text('Select Date & Time Range'),
                    titleSeparator: Divider(),
                    startWidget: Text('Start'),
                    endWidget: Text('End'),
                    separator: SizedBox(height: 16),
                    defaultTab: DefaultTab.start,
                    padding: EdgeInsets.all(16),
                    insetPadding: EdgeInsets.symmetric(horizontal: 40, vertical: 24),
                    theme: ThemeData.light(),
                    actionsBuilder: (context, confirmCallback, cancelCallback) {
                      return Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          TextButton(
                            onPressed: cancelCallback,
                            child: Text('Cancel'),
                          ),
                          ElevatedButton(
                            onPressed: confirmCallback,
                            child: Text('Confirm'),
                          ),
                        ],
                      );
                    },
                  );

The returned value of showOmniDateTimeRangePicker() will be a List with two DateTime:

[startDateTime, endDateTime].

Usage with more flexibility

OmniDateTimePicker is now available for use directly as a widget instead of the prebuilt dialogs.

카테고리

의존성

의존성 목록 5 개

소스 저장소

이 패키지를 사용하는 프로젝트