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

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

简介

simple_predicate_time_picker 是一个自定义的时间选择器插件,允许你像在 showDatePicker 中一样设置可选时间的筛选条件。此插件是对原作者 jorgesanure-pub-dep 的扩展版本,原项目已停止维护。

功能演示

下图展示了插件的基本功能:

时间选择器演示

使用示例

以下是一个完整的示例代码,展示如何使用 simple_predicate_time_picker 插件来实现自定义时间选择器。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: '时间选择器示例',
      home: CustomTimePickerDemo(),
    );
  }
}

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

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

class _CustomTimePickerDemoState extends State<CustomTimePickerDemo> {
  String? selectedTime;

  // 定义可用的小时和分钟
  List<int> _availableHours = [1, 4, 6, 8, 12];
  List<int> _availableMinutes = [0, 10, 30, 45, 50];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: InkWell(
          onTap: () {
            // 打开时间选择器
            showSimpleTimePicker(
              context: context,
              onFailValidation: (context) =>
                  showMessage(context, '不可用的选择'), // 验证失败回调
              initialTime: TimeOfDay(
                hour: _availableHours.first,
                minute: _availableMinutes.first,
              ), // 初始时间
              selectableTimePredicate: (time) =>
                  _availableHours.contains(time!.hour) &&
                  _availableMinutes.contains(time.minute), // 可选时间筛选条件
            ).then((time) {
              // 更新选中的时间
              setState(() => selectedTime = time?.format(context));
            });
          },
          child: Text(
            selectedTime ?? '请选择时间',
            style: TextStyle(fontSize: 55, fontWeight: FontWeight.bold),
          ),
        ),
      ),
    );
  }

  // 显示提示信息
  void showMessage(BuildContext context, String message) {
    showDialog(
      context: context,
      builder: (context) {
        return AlertDialog(
          contentPadding: EdgeInsets.zero,
          content: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              SizedBox(height: 16),
              Icon(
                Icons.warning,
                color: Colors.amber,
                size: 56,
              ),
              SizedBox(height: 12),
              Padding(
                padding: EdgeInsets.symmetric(horizontal: 15),
                child: Text(
                  message,
                  textAlign: TextAlign.center,
                  style: TextStyle(
                    color: Color(0xFF231F20),
                    fontSize: 20,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ),
              SizedBox(height: 12),
              InkWell(
                onTap: () => Navigator.of(context).pop(),
                child: Container(
                  alignment: Alignment.center,
                  width: double.infinity,
                  padding: EdgeInsets.symmetric(vertical: 16),
                  decoration: BoxDecoration(
                    border: Border(top: BorderSide(color: Color(0xFFE8ECF3))),
                  ),
                  child: Text(
                    '关闭',
                    style: TextStyle(
                      color: Color(0xFF2058CA),
                      fontSize: 18,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
              ),
            ],
          ),
        );
      },
    );
  }
}

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

1 回复

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


simple_predicate_time_picker 是一个用于 Flutter 的时间选择器插件,它允许用户选择时间,并且可以根据自定义的谓词(predicate)来限制可选的时间范围。以下是如何使用这个插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  simple_predicate_time_picker: ^1.0.0  # 请使用最新版本

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

2. 导入包

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

import 'package:simple_predicate_time_picker/simple_predicate_time_picker.dart';

3. 使用时间选择器

你可以使用 SimplePredicateTimePicker 来显示一个时间选择器。以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: TimePickerExample(),
    );
  }
}

class TimePickerExample extends StatefulWidget {
  @override
  _TimePickerExampleState createState() => _TimePickerExampleState();
}

class _TimePickerExampleState extends State<TimePickerExample> {
  TimeOfDay? _selectedTime;

  Future<void> _selectTime(BuildContext context) async {
    final TimeOfDay? picked = await showTimePicker(
      context: context,
      initialTime: TimeOfDay.now(),
      builder: (BuildContext context, Widget? child) {
        return SimplePredicateTimePicker(
          initialTime: TimeOfDay.now(),
          predicate: (TimeOfDay time) {
            // 这里可以定义你的时间选择逻辑
            // 例如,只允许选择上午的时间
            return time.hour < 12;
          },
        );
      },
    );

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Simple Predicate Time Picker Example'),
      ),
      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'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 自定义谓词

SimplePredicateTimePicker 中,你可以通过 predicate 参数来自定义时间选择的逻辑。predicate 是一个函数,它接收一个 TimeOfDay 对象并返回一个布尔值。如果返回 true,则该时间可选;如果返回 false,则该时间不可选。

例如,以下代码只允许选择上午的时间:

predicate: (TimeOfDay time) {
  return time.hour < 12;
}
回到顶部