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

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

TimeDropper 是一个灵感来源于 TimeDropperJS 的时间选择器插件。它提供了动画效果和完全可定制的圆形表盘。

特性

  • 动画效果和完全可定制的圆形表盘。
  • 可以适配系统主题或通过 TimeDropperThemeData 进行自定义。
  • 提供三种不同的设计样式。

不同的设计样式

TimeDropperStyle.outerFilled TimeDropperStyle.innerFilled TimeDropperStyle.bordered
DEMO1 DEMO2 DEMO3

开始使用

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

    dependencies:
      time_dropper: <latest_version>
    
  2. 在终端运行 flutter pub get 命令获取依赖。

  3. 导入 time_dropper 包:

    import 'package:time_dropper/time_dropper.dart';
    

使用方法

完整的实现可以查看 示例代码

_showTimeDropper(GlobalKey key) {
  showTimeDropper(
    context: context,
    onDone: () {
      // TODO: 使用此回调在时间选择器窗口关闭时更新时间
    },
    onTimeChanged: (time) {
      setState(() {
        _time = time;
      });
      // 使用此回调实时获取时间变化
    },
    containerKey: key,
    // 传递键以便时间选择器对话框靠近容器小部件打开(如果为null,则在中心打开)
    initialTime: _time,
    style: TimeDropperStyle.outerFilled,
    // 或者 TimeDropperStyle.innerFilled / TimeDropperStyle.bordered
  );
}

其他信息

showTimeDropper() 函数

showTimeDropper() 函数接受以下参数:

参数名 类型 描述
context BuildContext BuildContext
onTimeChanged void Function(TimeOfDay)? 回调函数,在时间变化时返回 TimeOfDay 对象(实时)
onDone void Function(TimeOfDay)? 回调函数,在对话框关闭时返回 TimeOfDay 对象
initialTime TimeOfDay? 默认选择的时间(如果为null,则选择当前时间)
containerKey GlobalKey? 传递键以便时间选择器对话框靠近容器小部件打开(如果为null,则在中心打开)
barrierColor Color? 背景颜色(默认为 Colors.black12
style TimeDropperStyle 一种样式,如 TimeDropperStyle.outerFilled, TimeDropperStyle.innerFilledTimeDropperStyle.bordered
themeData TimeDropperThemeData? 自定义对话框

TimeDropperStyle 枚举

TimeDropperStyle 枚举包括以下样式:

样式 引用
TimeDropperStyle.outerFilled / TimeDropperStyle.innerFilled / TimeDropperStyle.bordered 查看

TimeDropperThemeData

TimeDropperThemeData 可用于自定义对话框的外观:

属性 类型 描述
brightness Brightness? 对话框的亮度(lightdark),默认适应应用主题
primaryColor Color? 所有主要高亮组件的颜色,默认为应用主题的 colorScheme.secondary
canvasColor Color? 表盘背景颜色,默认为应用主题的 canvasColor
handleColor Color? 滑动手柄的颜色,默认为 primaryColor
handleDotsColor Color? 滑动手柄上的点的颜色,默认为 Colors.white
innerColor Color? 边框颜色(TimeDropperStyle.bordered)或内部表盘颜色(TimeDropperStyle.innerFilled),默认为 primaryColor
selectedColor Color? 选中文本的颜色(小时或分钟),默认为 primaryColor
unSelectedColor Color? 未选中文本的颜色(小时或分钟),默认为应用主题的 hintColor
selectedHandColor Color? 选中指针的颜色(小时或分钟指针),默认为 selectedColor.withOpacity(0.5)
unSelectedHandColor Color? 未选中指针的颜色(小时或分钟指针),默认为 unSelectedColor.withOpacity(0.5)
shadowColor Color? 抬升阴影的颜色,默认为应用主题的 hintColor
fontFamily String? 小部件的字体,默认为应用的主题字体

完整示例

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:time_dropper/time_dropper.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Time Dropper Example',
      theme: ThemeData(
        primarySwatch: Colors.indigo,
        fontFamily: GoogleFonts.montserrat().fontFamily,
      ),
      themeMode: ThemeMode.light,
      debugShowCheckedModeBanner: false,
      home: const Homepage(),
    );
  }
}

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

  [@override](/user/override)
  State<Homepage> createState() => _HomepageState();
}

class _HomepageState extends State<Homepage> {
  final _key1 = GlobalKey();
  final _key2 = GlobalKey();
  final _key3 = GlobalKey();
  TimeOfDay? _time1;
  TimeOfDay? _time2;
  TimeOfDay? _time3;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0.0,
        title: const Text("Time Dropper Example"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            FractionallySizedBox(
              widthFactor: 0.5,
              child: OutlinedButton(
                key: _key1,
                child: Text(
                    _time1 == null ? "Select time 1" : _time1!.format(context)),
                onPressed: () => _showPicker(_key1),
              ),
            ),
            Center(
              child: FractionallySizedBox(
                widthFactor: 0.5,
                child: OutlinedButton(
                  key: _key2,
                  child: Text(_time2 == null
                      ? "Select time 2"
                      : _time2!.format(context)),
                  onPressed: () => _showPicker(_key2),
                ),
              ),
            ),
            Align(
              alignment: Alignment.centerRight,
              child: FractionallySizedBox(
                widthFactor: 0.5,
                child: OutlinedButton(
                  key: _key3,
                  child: Text(_time3 == null
                      ? "Select time 3"
                      : _time3!.format(context)),
                  onPressed: () => _showPicker(_key3),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  _showPicker(GlobalKey key) {
    showTimeDropper(
      context: context,
      onDone: print,
      onTimeChanged: (time) {
        setState(() {
          if (key == _key1) _time1 = time;
          if (key == _key2) _time2 = time;
          if (key == _key3) _time3 = time;
        });
      },
      containerKey: key,
      initialTime: key == _key1
          ? _time1
          : key == _key2
              ? _time2
              : _time3,
      style: key == _key1
          ? TimeDropperStyle.outerFilled
          : key == _key2
              ? TimeDropperStyle.innerFilled
              : TimeDropperStyle.bordered,
      themeData: TimeDropperThemeData(elevation: 2),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用Flutter时间选择器插件 time_dropper 的代码示例。这个示例将展示如何在Flutter应用中集成并使用 time_dropper 插件来选择时间。

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

dependencies:
  flutter:
    sdk: flutter
  time_dropper: ^最新版本号  # 请替换为当前最新版本号

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

接下来,在你的 Flutter 应用中,你可以按照以下步骤使用 time_dropper

1. 导入必要的包

在你的 Dart 文件中导入 time_dropper 包:

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

2. 创建时间选择器的UI

下面是一个简单的示例,展示了如何在 Scaffold 中使用 TimeDropper 组件:

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  TimeOfDay? selectedTime;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Dropper Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              selectedTime == null
                  ? 'No time selected'
                  : '${selectedTime!.format(context)}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            TimeDropper(
              initialTime: selectedTime,
              onChanged: (TimeOfDay? newTime) {
                setState(() {
                  selectedTime = newTime;
                });
              },
              decoration: InputDecoration(
                labelText: 'Select Time',
                border: OutlineInputBorder(),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

将上述代码保存并运行你的 Flutter 应用。你应该会看到一个简单的界面,其中包含一个文本显示当前选中的时间(初始为空),以及一个时间选择器。

在这个示例中,TimeDropper 组件允许用户选择一个时间,当用户选择一个时间时,onChanged 回调会被触发,更新 selectedTime 状态,从而刷新界面以显示新选中的时间。

这样,你就成功地在 Flutter 应用中集成了 time_dropper 插件,并实现了时间选择功能。希望这个示例对你有帮助!

回到顶部