Flutter日期选择插件yet_another_date_picker的使用

Flutter日期选择插件yet_another_date_picker的使用

在开发过程中,我有一个需求是在数据库中搜索给定月份的数据,或者搜索每年特定天的数据。我没有找到一个能够支持所有这些场景的日期选择器,因为所有的日期选择器都是基于DateTime模块,无法单独选择日期而不选择年份或月份。

因此,我编写了这个包。

特性

该日期选择器具有以下额外选项:

  1. 选择没有具体日期的月份。
  2. 选择没有年份的日期(即仅选择月份和日期)。
  3. 从提供的年份列表中进行选择。
  4. 可以选择“任意”年份或“任意”日期,并使用DDMMYYYY对象来表示日期,其中日期或年份可以为null。

月份由数字表示,从0开始索引,以便可以直接索引。由于年份是由列表而不是范围提供的,因此可以跳过不需要的年份。

开始使用

步骤1:添加依赖包

在你的pubspec.yaml文件中添加yet_another_date_picker包:

dependencies:
  flutter:
    sdk: flutter
  yet_another_date_picker: ^x.x.x  # 替换为最新版本号
  flutter_riverpod: ^x.x.x       # 替换为最新版本号

然后运行:

flutter pub get

步骤2:添加riverpod

pubspec.yaml文件中添加flutter_riverpod包:

dependencies:
  flutter:
    sdk: flutter
  yet_another_date_picker: ^x.x.x  # 替换为最新版本号
  flutter_riverpod: ^x.x.x       # 替换为最新版本号

然后运行:

flutter pub get

步骤3:包裹整个应用程序

main.dart文件中,将整个应用程序包裹在一个ProviderScope小部件中:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

import 'package:yet_another_date_picker/yet_another_date_picker.dart';

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

步骤4:导入包

在需要使用日期选择器的文件中导入yet_another_date_picker包:

import 'package:yet_another_date_picker/yet_another_date_picker.dart';

步骤5:使用日期选择器

在你的应用中使用DateSelector小部件:

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const DateSelected(),
        ),
        body: Stack(
          children: [
            Center(
              child: ListView(
                children: [
                  const DateSelectorWrapper(),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Text.rich(TextSpan(
                        style: Theme.of(context).textTheme.bodyLarge!,
                        children: [
                          TextSpan(
                              style: Theme.of(context)
                                  .textTheme
                                  .headlineSmall!
                                  .copyWith(fontWeight: FontWeight.bold),
                              text: "Select date\n"),
                          const TextSpan(
                            text: "(from the years provided)\n",
                          ),
                          const TextSpan(
                              text:
                                  "* If the day is any, it selects a month\n"),
                          const TextSpan(
                              text: "* If the year is null, it represents "
                                  "the specific day from any year\n"),
                          const TextSpan(
                              text: "* Can't have both day and year empty\n"),
                        ])),
                  )
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

const List<String> monthsOfTheYear = [
  "JAN",
  "FEB",
  "MAR",
  "APR",
  "MAY",
  "JUN",
  "JUL",
  "AUG",
  "SEP",
  "OCT",
  "NOV",
  "DEC",
];

class DateSelected extends ConsumerWidget {
  const DateSelected({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    final ddmmyyyy = ref.watch(ddmmyyyyProvider);

    final day = (ddmmyyyy.dd == null)
        ? "Any day in "
        : "${ddmmyyyy.dd!.toString().padLeft(2, '0')} - ";
    final month = monthsOfTheYear[ddmmyyyy.mm];
    final year =
        (ddmmyyyy.yyyy == null) ? " of Any year" : " - ${ddmmyyyy.yyyy}";

    return Text(" Date Selected: $day$month$year");
  }
}

class DateSelectorWrapper extends ConsumerWidget {
  const DateSelectorWrapper({
    super.key,
  });

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref) {
    return DateSelector(
      years: List.generate(47, (index) => 1977 + index),  // 提供47年的年份列表
      initialDate: DDMMYYYY.fromDateTime(DateTime.now()),  // 设置初始日期为当前日期
      onDateChanged: (ddmmyyyy) async {
        ref.read(ddmmyyyyProvider.notifier).state = ddmmyyyy;  // 更新状态
      },
      width: MediaQuery.of(context).size.width * .5,  // 设置宽度
      height: MediaQuery.of(context).size.height * 0.6,  // 设置高度
      itemExtend: 40,  // 设置项目扩展
    );
  }
}

final ddmmyyyyProvider = StateProvider<DDMMYYYY>((ref) {
  return DDMMYYYY.fromDateTime(DateTime.now());  // 初始化时设置为当前日期
});

更多关于Flutter日期选择插件yet_another_date_picker的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日期选择插件yet_another_date_picker的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


yet_another_date_picker 是一个 Flutter 插件,用于在应用中方便地选择日期。它提供了一个简单的 API,允许你自定义日期选择器的外观和行为。以下是如何在 Flutter 项目中使用 yet_another_date_picker 插件的步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 yet_another_date_picker 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  yet_another_date_picker: ^1.0.0

然后运行 flutter pub get 以安装依赖。

2. 导入插件

在你的 Dart 文件中导入 yet_another_date_picker 插件:

import 'package:yet_another_date_picker/yet_another_date_picker.dart';

3. 使用日期选择器

你可以使用 YetAnotherDatePicker 类来显示日期选择器。以下是一个简单的示例,展示了如何显示日期选择器并在用户选择日期后获取所选日期。

import 'package:flutter/material.dart';
import 'package:yet_another_date_picker/yet_another_date_picker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DatePickerExample(),
    );
  }
}

class DatePickerExample extends StatefulWidget {
  [@override](/user/override)
  _DatePickerExampleState createState() => _DatePickerExampleState();
}

class _DatePickerExampleState extends State<DatePickerExample> {
  DateTime? _selectedDate;

  Future<void> _showDatePicker() async {
    final DateTime? pickedDate = await YetAnotherDatePicker.showDatePicker(
      context: context,
      initialDate: DateTime.now(),
      firstDate: DateTime(2000),
      lastDate: DateTime(2100),
    );

    if (pickedDate != null && pickedDate != _selectedDate) {
      setState(() {
        _selectedDate = pickedDate;
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Date Picker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _selectedDate == null
                  ? 'No date selected!'
                  : 'Selected Date: ${_selectedDate!.toLocal()}',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _showDatePicker,
              child: Text('Select Date'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部