Flutter日夜时间选择器插件day_night_time_picker的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter日夜时间选择器插件day_night_time_picker的使用

DayNightTimePicker

DayNightTimePicker 是一个用于Flutter的日夜时间选择器,它具有零依赖的特点。

Default style

IOS style

View it on pub.dev


安装

pubspec.yaml文件中添加依赖:

dependencies:
  day_night_time_picker:

使用方法

要使用此插件,只需导入包:

import 'package:day_night_time_picker/day_night_time_picker.dart';

示例代码

以下是一个完整的示例demo,展示了如何使用day_night_time_picker插件创建一个包含弹出式和内联样式的时间选择器的应用程序:

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Time picker',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const Home(),
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Time _time = Time(hour: 11, minute: 30, second: 20);
  bool iosStyle = true;

  void onTimeChanged(Time newTime) {
    setState(() {
      _time = newTime;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Center(
          child: SingleChildScrollView(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  "Popup Picker Style",
                  style: Theme.of(context).textTheme.titleLarge,
                ),
                Text(
                  "${_time.hour}:${_time.minute}:${_time.second} ${_time.period.name}"
                      .toUpperCase(),
                  textAlign: TextAlign.center,
                  style: Theme.of(context).textTheme.displayLarge,
                ),
                const SizedBox(height: 10),
                TextButton(
                  style: TextButton.styleFrom(
                    backgroundColor: Theme.of(context).colorScheme.secondary,
                  ),
                  onPressed: () {
                    Navigator.of(context).push(
                      showPicker(
                        showSecondSelector: true,
                        context: context,
                        value: _time,
                        onChange: onTimeChanged,
                        minuteInterval: TimePickerInterval.FIVE,
                        // Optional onChange to receive value as DateTime
                        onChangeDateTime: (DateTime dateTime) {
                          debugPrint("[debug datetime]:  $dateTime");
                        },
                      ),
                    );
                  },
                  child: const Text(
                    "Open time picker",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
                const SizedBox(height: 10),
                const Divider(),
                const SizedBox(height: 10),
                Text(
                  "Inline Picker Style",
                  style: Theme.of(context).textTheme.titleLarge,
                ),
                SizedBox(
                  width: 400,
                  // Render inline widget
                  child: showPicker(
                    isInlinePicker: true,
                    elevation: 1,
                    value: _time,
                    onChange: onTimeChanged,
                    minuteInterval: TimePickerInterval.FIVE,
                    iosStylePicker: iosStyle,
                    minHour: 9,
                    maxHour: 21,
                    is24HrFormat: false,
                  ),
                ),
                Text(
                  "IOS Style",
                  style: Theme.of(context).textTheme.bodyLarge,
                ),
                Switch(
                  value: iosStyle,
                  onChanged: (newVal) {
                    setState(() {
                      iosStyle = newVal;
                    });
                  },
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

属性说明

名称 描述 默认值
value 必填项。显示的初始时间。 -
onChange 必填项。用户选择新时间时的回调函数。 -
isInlinePicker 是否渲染为内联组件。 false
onChangeDateTime 可选项。返回用户选择的新时间为DateTime格式。 -
onCancel 可选项。自定义取消按钮的回调函数。 -
is24HrFormat 是否以24小时制显示时间。 false
accentColor 时间选择器的强调色。 Theme.of(context).accentColor
unselectedColor 未选中选项的颜色(如am/pm、小时/分钟)。 Colors.grey
cancelText 取消按钮的文本。 cancel
okText 确认按钮的文本。 ok
sunAsset 日出图片资源。 提供的资产
moonAsset 日落图片资源。 提供的资产
blurredBackground 是否模糊背景。 false
barrierColor 模态框背景颜色。 Colors.black45
borderRadius 容器的圆角半径。 10.0
elevation 模态框的阴影高度。 12.0
dialogInsetPadding 模态框的内边距。 EdgeInsets.symmetric(horizontal: 40.0, vertical: 24.0)
barrierDismissible 点击外部是否关闭模态框。 true
showCancelButton 是否显示取消按钮。 true
iosStylePicker 是否显示iOS风格的选择器。 false
hourLabel 小时选择器的标签(仅iOS风格)。 'hours'
minuteLabel 分钟选择器的标签(仅iOS风格)。 'minutes'
minuteInterval 分钟选择的间隔。 TimePickerInterval.ONE
secondInterval 秒数选择的间隔。 TimePickerInterval.ONE
disableMinute 是否禁用分钟选择器。 false
disableHour 是否禁用小时选择器。 false
minHour 可选最小小时。 默认为1(12小时制)或0(24小时制)
maxHour 可选最大小时。 默认为12(12小时制)或23(24小时制)
minMinute 可选最小时。 0
minSecond 可选最小秒。 0
maxMinute 可选最大分钟。 59
maxSecond 可选最大秒。 59
displayHeader 是否显示日出日落动画。 true
isOnValueChangeMode 是否隐藏确认和取消按钮,并在每次值变化时返回。 false
focusMinutePicker 是否自动聚焦分钟选择器。 false
themeData 组件使用的主题数据。 Theme.of(context)
okStyle 确认按钮的文本样式。 const TextStyle(fontWeight: FontWeight.bold)
cancelStyle 取消按钮的文本样式。 const TextStyle(fontWeight: FontWeight.bold)
buttonStyle 按钮样式。如果未提供cancelButtonStyle,则应用于确认和取消按钮。 Theme.of(context).colorScheme.secondary
cancelButtonStyle 取消按钮样式。 Theme.of(context).colorScheme.secondary
buttonsSpacing 确认和取消按钮之间的间距。 0
wheelHeight 仅限createInlinePicker,轮子的高度。 240
hideButtons 是否隐藏按钮(确认和取消)。 false
disableAutoFocusToNextInput 是否禁用当前输入选择后自动聚焦到下一个输入。 false
width 选择器容器的固定宽度。 300(iOS风格为350
height 选择器容器的固定高度。 400

通过上述属性,您可以根据需要自定义时间选择器的外观和行为。希望这个插件能帮助您更方便地实现时间选择功能!


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

1 回复

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


当然,以下是如何在Flutter应用中使用day_night_time_picker插件的一个代码示例。这个插件允许用户选择一个时间,并且界面会根据系统主题(白天或夜间模式)自动调整。

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

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

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

接下来,你可以在你的Flutter应用中使用这个插件。以下是一个简单的示例,展示了如何使用DayNightTimePicker

import 'package:flutter/material.dart';
import 'package:day_night_time_picker/day_night_time_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> {
  TimeOfDay? selectedTime;

  void _selectTime(BuildContext context) async {
    final TimeOfDay? picked = await showDayNightTimePicker(
      context: context,
      initialTime: selectedTime ?? TimeOfDay.now(),
      theme: DayNightTimePickerThemeData(
        dayTheme: DayTimePickerThemeData(
          backgroundColor: Colors.white,
          textStyle: TextStyle(color: Colors.black),
        ),
        nightTheme: NightTimePickerThemeData(
          backgroundColor: Colors.black,
          textStyle: TextStyle(color: Colors.white),
        ),
      ),
    );

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DayNightTimePicker Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              selectedTime == null
                  ? 'No time selected.'
                  : 'Selected time: ${selectedTime!.format(context)}',
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _selectTime(context),
              child: Text('Select Time'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击该按钮将打开一个时间选择器。时间选择器会根据系统主题(白天或夜间模式)自动调整界面。

关键点是showDayNightTimePicker函数,它用于显示时间选择器对话框。你可以传递contextinitialTime(初始时间)以及一个可选的theme参数来自定义白天和夜间模式下的主题。

注意:DayNightTimePickerThemeDataDayTimePickerThemeDataNightTimePickerThemeData是假设的类名,具体实现可能有所不同,具体请参考day_night_time_picker插件的官方文档和示例代码。如果插件作者提供了自定义主题的功能,你应该按照文档中的说明来实现。如果插件没有提供这些功能,你可以直接使用默认主题。

回到顶部