Flutter日期时间选择器插件samore_weekenddatetime_picker的使用

Flutter日期时间选择器插件samore_weekenddatetime_picker的使用

这是一个用于在排除周末(周六和周日)的情况下选择日期和时间的Flutter插件。该插件确保用户只能选择工作日,并且不能选择过去的日期。

特性

  • 自动跳过周末的日期选择器。
  • 集成了时间选择器。
  • 可定制且易于集成到你的Flutter项目中。

开始使用

samore_weekenddatetime_picker 添加到你的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  samore_weekenddatetime_picker: ^1.0.0

然后运行:

flutter pub get

使用方法

以下是如何在你的Flutter应用中使用 samore_weekenddatetime_picker 包的方法。

步骤1:添加依赖

首先,在你的 pubspec.yaml 文件中添加 samore_weekenddatetime_picker 作为依赖项。

步骤2:导入包

在你的Dart文件中导入包:

import 'package:samore_weekenddatetime_picker/samore_weekenddatetime_picker.dart';

步骤3:使用DateTimePickerExample小部件

你可以将 DateTimePickerExample 小部件集成到你的Flutter应用中,以便允许用户选择一个日期和时间(排除周末)。

自定义选择器

DateTimePickerExample 小部件允许你:

  • 选择日期:日期选择器排除了周六和周日,确保用户选择有效的工作日。
  • 选择时间:时间选择器允许用户选择具体的时间。
  • 显示所选日期和时间:所选值以用户友好的格式显示(例如,dd/MM/yyyy hh:mm a)。

完整示例代码

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:samore_weekenddatetime_picker/samore_weekenddatetime_picker.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'samore_weekenddatetime_picker Example',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('DateTime Picker Example'),
        ),
        body: const DateTimePickerExample(),
      ),
    );
  }
}

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

  [@override](/user/override)
  _DateTimePickerExampleState createState() => _DateTimePickerExampleState();
}

class _DateTimePickerExampleState extends State<DateTimePickerExample> {
  DateTime? selectedDateTime;
  TimeOfDay? selectedTime;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: ElevatedButton(
        onPressed: () async {
          final DateTime? pickedDateTime = await showDialog(
            context: context,
            builder: (BuildContext context) {
              DateTime currentDate = DateTime.now();
              while (!selectableDayPredicate(currentDate)) {
                currentDate = currentDate.add(const Duration(days: 1));
              }
              return StatefulBuilder(
                builder: (context, setState) {
                  return AlertDialog(
                    title: const Text("Select Date and Time"),
                    content: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        // 日期选择器
                        SizedBox(
                          width: 500,
                          child: CalendarDatePicker(
                            initialDate: currentDate,
                            firstDate: DateTime.now().subtract(const Duration(days: 365)),
                            lastDate: DateTime.now().add(const Duration(days: 365)),
                            selectableDayPredicate: selectableDayPredicate,
                            onDateChanged: (DateTime newDate) {
                              setState(() {
                                currentDate = newDate;
                              });
                            },
                          ),
                        ),
                        // 时间选择器
                        SizedBox(
                          width: 500,
                          child: Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              TextButton(
                                onPressed: () async {
                                  final TimeOfDay? pickedTime = await showTimePicker(
                                    context: context,
                                    initialTime: selectedTime ?? TimeOfDay.now(),
                                  );
                                  if (pickedTime != null) {
                                    setState(() {
                                      selectedTime = pickedTime;
                                    });
                                  }
                                },
                                child: const Text(
                                  'Select Time',
                                  style: TextStyle(color: Colors.blue),
                                ),
                              ),
                              Text(
                                selectedTime != null
                                    ? '${selectedTime!.hour}:${selectedTime!.minute} ${selectedTime!.period == DayPeriod.am ? 'AM' : 'PM'}'
                                    : DateFormat('hh:mm a').format(currentDate),
                                style: const TextStyle(fontSize: 16),
                              ),
                            ],
                          ),
                        ),
                      ],
                    ),
                    actions: [
                      TextButton(
                        onPressed: () {
                          Navigator.of(context).pop();
                        },
                        child: const Text('Cancel'),
                      ),
                      TextButton(
                        onPressed: () {
                          if (selectedTime != null) {
                            currentDate = DateTime(
                              currentDate.year,
                              currentDate.month,
                              currentDate.day,
                              selectedTime!.hour,
                              selectedTime!.minute,
                            );
                          }
                          Navigator.of(context).pop(currentDate);
                        },
                        child: const Text('OK'),
                      ),
                    ],
                  );
                },
              );
            },
          );
          if (pickedDateTime != null) {
            setState(() {
              selectedDateTime = pickedDateTime;
            });
          }
        },
        child: Text(selectedDateTime != null
            ? DateFormat('dd/MM/yyyy hh:mm a').format(selectedDateTime!)
            : 'Select Date and Time'),
      ),
    );
  }

  bool selectableDayPredicate(DateTime day) {
    // 防止选择周六、周日以及早于当前日期的日期
    return day.weekday != DateTime.saturday && 
           day.weekday != DateTime.sunday &&
           !day.isBefore(DateTime.now());
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用samore_weekenddatetime_picker插件的一个示例代码案例。这个插件允许用户选择一个日期和时间,同时可以排除周末。

首先,确保你的Flutter项目已经创建,并且pubspec.yaml文件中已经添加了samore_weekenddatetime_picker依赖:

dependencies:
  flutter:
    sdk: flutter
  samore_weekenddatetime_picker: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来获取依赖。

接下来,在你的Dart文件中使用SamoreWeekendDateTimePicker。以下是一个完整的示例,展示了如何使用这个插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  DateTime? selectedDateTime;

  void _selectDateTime() async {
    final DateTime? picked = await showSamoreWeekendDateTimePicker(
      context: context,
      initialDateTime: selectedDateTime ?? DateTime.now(),
      firstDate: DateTime(2023),
      lastDate: DateTime(2025),
      locale: Localizations.localeOf(context),
    );

    if (picked != null && picked != selectedDateTime) {
      setState(() {
        selectedDateTime = picked;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter DateTime Picker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              selectedDateTime == null
                  ? 'No date selected.'
                  : 'Selected Date: ${selectedDateTime!.toLocal()}',
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _selectDateTime,
              child: Text('Select Date and Time'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. MyApp 是应用程序的根部件。
  2. MyHomePage 是一个包含主要逻辑的有状态部件。
  3. _selectDateTime 方法调用showSamoreWeekendDateTimePicker来显示日期时间选择器。用户可以在这个选择器中排除周末。
  4. 选择的日期和时间会显示在按钮下面的文本中。

确保在调用showSamoreWeekendDateTimePicker时传入正确的context,以及根据需要设置initialDateTimefirstDatelastDate等参数。

这样,你就可以在你的Flutter应用中使用samore_weekenddatetime_picker插件来选择日期和时间,同时排除周末了。

回到顶部