Dart 语言 构建自定义时间选择控件

Dart阿木 发布于 2025-06-19 10 次阅读


自定义时间选择控件在Dart语言中的应用

在移动应用开发中,时间选择控件是一个常见的用户界面元素,用于让用户选择或设置时间。Dart语言作为Flutter框架的官方开发语言,提供了丰富的UI组件库。标准库中的时间选择控件可能无法满足所有应用的需求。构建一个自定义时间选择控件成为了一种必要的技术挑战。本文将围绕Dart语言,探讨如何构建一个功能完善、样式丰富的自定义时间选择控件。

环境准备

在开始编写代码之前,确保你已经安装了Dart和Flutter环境。你可以通过以下命令安装Dart:

bash

sudo apt-get install dart


然后,安装Flutter SDK:

bash

flutter install


自定义时间选择控件的设计

1. 功能需求

- 支持小时和分钟的选取。

- 允许用户通过滑动选择小时和分钟。

- 提供一个清晰的界面,显示当前选择的时间。

- 支持自定义样式和颜色。

2. 技术选型

- 使用Flutter框架进行UI设计。

- 使用`DateTime`类处理时间逻辑。

- 使用`AnimatedContainer`实现滑动效果。

代码实现

1. 创建一个新的Flutter项目

bash

flutter create custom_time_picker


cd custom_time_picker


2. 设计自定义时间选择控件

在`lib`目录下创建一个新的文件`custom_time_picker.dart`,并编写以下代码:

dart

import 'package:flutter/material.dart';


import 'package:flutter_screenutil/flutter_screenutil.dart';

class CustomTimePicker extends StatefulWidget {


final ValueChanged<TimeOfDay> onTimeChanged;


final Color? hourColor;


final Color? minuteColor;

const CustomTimePicker({


Key? key,


required this.onTimeChanged,


this.hourColor = Colors.black,


this.minuteColor = Colors.black,


}) : super(key: key);

@override


_CustomTimePickerState createState() => _CustomTimePickerState();


}

class _CustomTimePickerState extends State<CustomTimePicker> {


TimeOfDay _selectedTime = TimeOfDay.now();

void _onHourChanged(int value) {


setState(() {


_selectedTime = TimeOfDay(hour: value, minute: _selectedTime.minute);


widget.onTimeChanged(_selectedTime);


});


}

void _onMinuteChanged(int value) {


setState(() {


_selectedTime = TimeOfDay(hour: _selectedTime.hour, minute: value);


widget.onTimeChanged(_selectedTime);


});


}

@override


Widget build(BuildContext context) {


return Column(


mainAxisAlignment: MainAxisAlignment.center,


children: <Widget>[


_buildTimePicker(


title: 'Hour',


maxValue: 23,


minValue: 0,


currentValue: _selectedTime.hour,


onChanged: _onHourChanged,


color: widget.hourColor,


),


SizedBox(height: 20.h),


_buildTimePicker(


title: 'Minute',


maxValue: 59,


minValue: 0,


currentValue: _selectedTime.minute,


onChanged: _onMinuteChanged,


color: widget.minuteColor,


),


],


);


}

Widget _buildTimePicker({


required String title,


required int maxValue,


required int minValue,


required int currentValue,


required ValueChanged<int> onChanged,


required Color color,


}) {


return Column(


crossAxisAlignment: CrossAxisAlignment.start,


children: <Widget>[


Text(title, style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold)),


SizedBox(height: 10.h),


AnimatedContainer(


duration: Duration(milliseconds: 300),


curve: Curves.easeInOut,


padding: EdgeInsets.symmetric(horizontal: 20.w),


decoration: BoxDecoration(


color: color,


borderRadius: BorderRadius.circular(10.r),


boxShadow: [


BoxShadow(


color: color.withOpacity(0.5),


spreadRadius: 2,


blurRadius: 5,


offset: Offset(0, 3),


),


],


),


child: Row(


mainAxisAlignment: MainAxisAlignment.center,


children: <Widget>[


_buildNumberPicker(


maxValue: maxValue,


minValue: minValue,


currentValue: currentValue,


onChanged: onChanged,


),


SizedBox(width: 10.w),


_buildNumberPicker(


maxValue: maxValue,


minValue: minValue,


currentValue: currentValue,


onChanged: onChanged,


),


],


),


),


],


);


}

Widget _buildNumberPicker({


required int maxValue,


required int minValue,


required int currentValue,


required ValueChanged<int> onChanged,


}) {


return Expanded(


child: Slider(


value: currentValue.toDouble(),


min: minValue.toDouble(),


max: maxValue.toDouble(),


divisions: maxValue - minValue,


onChanged: (double value) {


onChanged(value.round());


},


),


);


}


}


3. 使用自定义时间选择控件

在你的Flutter应用中,你可以像使用其他Widget一样使用`CustomTimePicker`:

dart

import 'package:flutter/material.dart';


import 'custom_time_picker.dart';

void main() {


runApp(MyApp());


}

class MyApp extends StatelessWidget {


@override


Widget build(BuildContext context) {


return MaterialApp(


home: Scaffold(


appBar: AppBar(


title: Text('Custom Time Picker Example'),


),


body: Center(


child: CustomTimePicker(


onTimeChanged: (time) {


print('Selected time: $time');


},


),


),


),


);


}


}


总结

通过以上步骤,我们使用Dart语言和Flutter框架成功构建了一个自定义时间选择控件。这个控件可以满足基本的时钟选择需求,并且可以通过传入参数来自定义样式和颜色。在实际应用中,你可以根据具体需求进一步扩展和优化这个控件的功能和性能。