Flutter时间范围选择插件time_range的使用

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

Flutter时间范围选择插件time_range的使用

header.jpg

Flutter包用于通过时间块选择时间范围

time_range 是一个Flutter包,允许您在应用程序中添加时间范围选择器。您可以指定初始时间和时间块的步长,并自定义组件样式。

time_range_example.gif

属性

属性名 类型 描述
fromTitle Widget 作为开始时间选择器标题显示的小部件
toTitle Widget 作为结束时间选择器标题显示的小部件
titlePadding double 应用于fromTitle和toTitle的左侧填充
borderColor Color 时间选择按钮边框颜色
activeBorderColor Color 已选时间选择按钮边框颜色
textStyle TextStyle 时间选择按钮文本样式
activeTextStyle TextStyle 已选时间选择按钮文本样式
backgroundColor Color 时间选择按钮背景颜色
activeBackgroundColor Color 已选时间选择按钮背景颜色
firstTime TimeOfDay 挑选器开始时间
lastTime TimeOfDay 挑选器结束时间
initialRange TimeRangeResult 初始选择范围
timeStep double 初始选择器小时之间的分钟跳跃
timeBlock double 时间块大小(以分钟为单位)。最终选择器将根据用户选择的开始时间重新计算,以便用户选择包含此时间段倍数的范围
onRangeCompleted void Function(TimeRangeResult) 通知所选范围变化的回调。如果在选择了范围之后再次选择了初始时间,则回调将返回null

使用示例

下面是一个完整的示例demo,展示了如何使用 time_range 包创建一个时间范围选择器:

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

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  static const orange = Color(0xFFFE9A75);
  static const dark = Color(0xFF333A47);
  static const double leftPadding = 50;

  final _defaultTimeRange = TimeRangeResult(
    const TimeOfDay(hour: 14, minute: 00),
    const TimeOfDay(hour: 15, minute: 00),
  );
  TimeRangeResult? _timeRange;

  @override
  void initState() {
    super.initState();
    _timeRange = _defaultTimeRange;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.only(top: 16, left: leftPadding),
              child: Text(
                'Opening Times',
                style: Theme.of(context)
                    .textTheme
                    .headlineMedium!
                    .copyWith(fontWeight: FontWeight.bold, color: dark),
              ),
            ),
            const SizedBox(height: 20),
            TimeRange(
              fromTitle: const Text(
                'FROM',
                style: TextStyle(
                  fontSize: 14,
                  color: dark,
                  fontWeight: FontWeight.w600,
                ),
              ),
              toTitle: const Text(
                'TO',
                style: TextStyle(
                  fontSize: 14,
                  color: dark,
                  fontWeight: FontWeight.w600,
                ),
              ),
              titlePadding: leftPadding,
              textStyle: const TextStyle(
                fontWeight: FontWeight.normal,
                color: dark,
              ),
              activeTextStyle: const TextStyle(
                fontWeight: FontWeight.bold,
                color: orange,
              ),
              borderColor: dark,
              activeBorderColor: dark,
              backgroundColor: Colors.transparent,
              activeBackgroundColor: dark,
              firstTime: const TimeOfDay(hour: 8, minute: 00),
              lastTime: const TimeOfDay(hour: 20, minute: 00),
              initialRange: _timeRange,
              timeStep: 30,
              timeBlock: 30,
              onRangeCompleted: (range) => setState(() => _timeRange = range),
              onFirstTimeSelected: (startHour) {},
            ),
            const SizedBox(height: 30),
            if (_timeRange != null)
              Padding(
                padding: const EdgeInsets.only(top: 8.0, left: leftPadding),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text(
                      'Selected Range: ${_timeRange!.start.format(context)} - ${_timeRange!.end.format(context)}',
                      style: const TextStyle(fontSize: 20, color: dark),
                    ),
                    const SizedBox(height: 20),
                    MaterialButton(
                      onPressed: () => setState(() => _timeRange = _defaultTimeRange),
                      color: orange,
                      child: const Text('Default'),
                    )
                  ],
                ),
              ),
          ],
        ),
      ),
    );
  }
}

解释

  • fromTitletoTitle: 定义了时间选择器左右两边的标题。
  • titlePadding: 设置标题的左边距。
  • textStyleactiveTextStyle: 分别设置未选中和选中状态下文本的样式。
  • borderColoractiveBorderColor: 设置边框的颜色。
  • backgroundColoractiveBackgroundColor: 设置背景颜色。
  • firstTimelastTime: 定义时间选择器的起始和结束时间。
  • initialRange: 初始选择的时间范围。
  • timeSteptimeBlock: 设置时间选择器的步长和时间块大小。
  • onRangeCompleted: 当用户完成选择时触发的回调函数。
  • onFirstTimeSelected: 用户选择开始时间时触发的回调函数(本例中为空)。

以上代码展示了一个完整的时间范围选择器的实现,您可以根据实际需求调整属性值和样式。


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

1 回复

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


当然,以下是如何在Flutter中使用time_range插件来选择时间范围的示例代码。time_range插件通常用于让用户选择两个时间点之间的范围,例如选择开始时间和结束时间。

首先,确保在你的pubspec.yaml文件中添加time_range依赖:

dependencies:
  flutter:
    sdk: flutter
  time_range_picker: ^x.y.z  # 请将x.y.z替换为实际的版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤来使用time_range插件:

  1. 导入插件
import 'package:time_range_picker/time_range_picker.dart';
  1. 创建时间范围选择对话框

你可以使用TimeRangePicker来创建一个时间范围选择对话框。以下是一个完整的示例,展示如何在按钮点击时显示时间范围选择对话框,并处理用户的选择结果。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('TimeRange Picker Example'),
        ),
        body: Center(
          child: TimeRangePickerButtonExample(),
        ),
      ),
    );
  }
}

class TimeRangePickerButtonExample extends StatefulWidget {
  @override
  _TimeRangePickerButtonExampleState createState() => _TimeRangePickerButtonExampleState();
}

class _TimeRangePickerButtonExampleState extends State<TimeRangePickerButtonExample> {
  DateTime? startTime;
  DateTime? endTime;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Selected Time Range:'),
        if (startTime != null && endTime != null)
          Text('${startTime!.toLocal().toString().split(' ')[1]} - ${endTime!.toLocal().toString().split(' ')[1]}'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            final TimeRangeResult result = await showTimeRangePicker(
              context: context,
              startTime: DateTime.now(),
              endTime: DateTime.now().add(Duration(hours: 2)),
              locale: Localizations.localeOf(context),
            );

            if (result.confirmed) {
              setState(() {
                startTime = result.selection.start;
                endTime = result.selection.end;
              });
            }
          },
          child: Text('Select Time Range'),
        ),
      ],
    );
  }
}

在这个示例中:

  • TimeRangePickerButtonExample是一个有状态的widget,它持有用户选择的时间范围(startTimeendTime)。
  • ElevatedButtononPressed方法调用showTimeRangePicker函数来显示时间范围选择对话框。
  • showTimeRangePicker函数返回一个TimeRangeResult对象,其中包含用户的选择结果。
  • 如果用户确认了选择(即result.confirmedtrue),则更新startTimeendTime状态。
  • 页面上会显示用户选择的时间范围(如果已选择)。

请注意,showTimeRangePicker函数的一些参数可以根据需要进行调整,例如startTimeendTime的默认值,以及locale以支持本地化。

这个示例提供了一个基本的实现,你可以根据需要进一步自定义UI和逻辑。

回到顶部