Flutter时间选择器插件dropdown_timepicker的使用

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

Flutter时间选择器插件dropdown_timepicker的使用

描述

Dropdown TimePicker 是一个为Flutter应用提供的可自定义的时间选择器。它支持12小时和24小时格式,并且可以通过下拉菜单选择时间。以下是关于如何使用该插件的详细说明和完整示例代码。

功能

  • 支持12小时和24小时格式
  • 可自定义样式(如边框、提示文本等)
  • 支持表单验证
  • 提供回调函数以获取用户选择的时间

截图

Main View Month View Date View

使用方法

1. 添加依赖

pubspec.yaml 文件中添加 dropdown_timepicker 依赖:

dependencies:
  dropdown_timepicker: ^0.1.0
2. 完整示例代码
// ignore_for_file: avoid_print

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dropdown TimePicker Demo',
      themeMode: ThemeMode.system,
      theme: ThemeData(
        brightness: Brightness.light,
        // light theme settings
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        // dark theme settings
      ),
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(title: 'Dropdown TimePicker Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  AutovalidateMode _autovalidate = AutovalidateMode.disabled;
  String _selectedAmPm = 'AM';
  int _selectedMins = 10;
  int _selectedHours = 1;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Form(
        key: formKey,
        autovalidateMode: _autovalidate,
        child: Padding(
          padding: const EdgeInsets.symmetric(horizontal: 8.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              DropdownTimePicker(
                isExpanded: true, // 使下拉框占据整个宽度
                isDropdownHideUnderline: true, // 隐藏下拉框的下划线
                isFormValidator: true, // 启用表单验证
                showAmPm: true, // 显示AM/PM选项
                width: 10, // 设置下拉框的宽度(可选)
                is24format: false, // 使用12小时格式
                onChangedAmPm: (value) {
                  setState(() {
                    _selectedAmPm = value ?? 'AM'; // 更新AM/PM值
                  });
                  print('onChangedAM: $value'); // 打印选择的AM/PM
                },
                onChangedMins: (value) {
                  setState(() {
                    _selectedMins = int.parse(value ?? '10'); // 更新分钟数
                  });
                  print('onChangedMins: $value'); // 打印选择的分钟数
                },
                onChangedHours: (value) {
                  setState(() {
                    _selectedHours = int.parse(value ?? '1'); // 更新小时数
                  });
                  print('onChangedHours: $value'); // 打印选择的小时数
                },
              ),
              MaterialButton(
                onPressed: () {
                  if (formKey.currentState!.validate()) {
                    formKey.currentState!.save();
                    TimeOfDay? date = _dateTime(_selectedAmPm, _selectedMins, _selectedHours);
                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        action: SnackBarAction(
                          label: 'OK',
                          onPressed: () {},
                        ),
                        content: Text('选择的时间是 $date'), // 显示选择的时间
                        elevation: 20,
                      ),
                    );
                  } else {
                    print('验证失败');
                    setState(() {
                      _autovalidate = AutovalidateMode.always; // 开启自动验证
                    });
                  }
                },
                child: const Text('提交'),
              )
            ],
          ),
        ),
      ),
    );
  }

  // 将字符串转换为TimeOfDay对象
  TimeOfDay? _dateTime(String? ampm, int? mins, int? hours) {
    if (mins != null && hours != null) {
      // 将AM/PM转换为24小时制
      if (ampm != null && ampm == 'PM') {
        hours = hours + 12;
      }
      return TimeOfDay(hour: hours, minute: mins);
    }
    return null;
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用dropdown_timepicker插件的代码示例。dropdown_timepicker是一个流行的Flutter插件,用于选择时间,它以一个下拉菜单的形式呈现。

首先,确保你已经在pubspec.yaml文件中添加了dropdown_timepicker依赖:

dependencies:
  flutter:
    sdk: flutter
  dropdown_timepicker: ^5.0.0  # 请检查最新版本号

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

接下来,你可以在你的Flutter应用中使用这个插件。下面是一个完整的示例代码,展示了如何使用dropdown_timepicker来选择一个时间:

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  TimeOfDay _selectedTime = TimeOfDay.now();

  void _selectTime(BuildContext context) async {
    final TimeOfDay? picked = await showTimePicker(
      context: context,
      initialTime: _selectedTime,
      builder: (BuildContext context, Widget? child) {
        return Theme(
          data: ThemeData.light().copyWith(
            colorScheme: ColorScheme.fromSwatch(
              primarySwatch: Colors.blue,
            ),
          ),
          child: child!,
        );
      },
    );

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dropdown TimePicker Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected Time: ${_selectedTime.format(context)}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            DropdownButtonHideUnderline(
              child: ButtonTheme(
                alignedDropdown: true,
                child: DropdownButton<String>(
                  value: _selectedTime.format(context),
                  hint: Text('Select Time'),
                  onChanged: (newValue) async {
                    // 这里我们其实不会通过 DropdownButton 直接改变时间,
                    // 因为 DropdownButton 通常用于选择预定义的值列表。
                    // 但为了演示,我们假设点击后调用时间选择器。
                    await _selectTime(context);
                    // 注意:这里不会真的从 DropdownButton 的 onChange 回调中更新值,
                    // 因为时间不是预定义的列表项,而是通过时间选择器得到的。
                    // 这只是为了展示如何触发时间选择器。
                    // 在实际使用中,你应该移除或调整这部分逻辑。
                  },
                  items: <String>[].map<DropdownMenuItem<String>>((String value) {
                    return DropdownMenuItem<String>(
                      value: value,
                      child: Text(value),
                    );
                  }).toList(), // 这里通常会有一个值的列表,但时间不适合这种方式。
                ),
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          await _selectTime(context);
        },
        tooltip: 'Pick Time',
        child: Icon(Icons.access_time),
      ),
    );
  }
}

注意

  1. 在上面的代码中,DropdownButton实际上并不适合用于直接选择时间,因为时间不是预定义的选项列表。这里只是为了演示如何集成时间选择器,并在用户交互时触发它。
  2. 更好的做法是使用一个按钮(如FloatingActionButton)来触发时间选择器,如代码中的floatingActionButton所示。
  3. 如果你确实想使用下拉列表来选择时间(例如,选择预定义的几个时间点),你需要自己管理这些时间点,并将它们作为DropdownMenuItem的列表传递给DropdownButton

希望这个示例能帮助你理解如何在Flutter应用中使用dropdown_timepicker插件。

回到顶部