在Flutter中实现Web端的时分秒选择器,可以通过以下方式实现:
1. 使用第三方库(推荐)
time_range_picker
import 'package:time_range_picker/time_range_picker.dart';
TimeOfDayRange? selectedRange = await showTimeRangePicker(
context: context,
start: TimeOfDay(hour: 9, minute: 0),
end: TimeOfDay(hour: 17, minute: 0),
);
if (selectedRange != null) {
print('开始时间: ${selectedRange.start}');
print('结束时间: ${selectedRange.end}');
}
flutter_time_picker_spinner
import 'package:flutter_time_picker_spinner/flutter_time_picker_spinner.dart';
TimePickerSpinner(
is24HourMode: false,
normalTextStyle: TextStyle(fontSize: 24, color: Colors.grey),
highlightedTextStyle: TextStyle(fontSize: 24, color: Colors.blue),
spacing: 50,
itemHeight: 80,
isForce2Digits: true,
onTimeChange: (time) {
print('选择的时间: $time');
},
)
2. 自定义实现
class TimePicker extends StatefulWidget {
@override
_TimePickerState createState() => _TimePickerState();
}
class _TimePickerState extends State<TimePicker> {
int _selectedHour = 0;
int _selectedMinute = 0;
int _selectedSecond = 0;
List<int> _hours = List.generate(24, (i) => i);
List<int> _minutes = List.generate(60, (i) => i);
List<int> _seconds = List.generate(60, (i) => i);
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 小时选择
_buildPicker(_hours, _selectedHour, (value) {
setState(() => _selectedHour = value);
}, '时'),
// 分钟选择
_buildPicker(_minutes, _selectedMinute, (value) {
setState(() => _selectedMinute = value);
}, '分'),
// 秒选择
_buildPicker(_seconds, _selectedSecond, (value) {
setState(() => _selectedSecond = value);
}, '秒'),
],
);
}
Widget _buildPicker(List<int> items, int selected, ValueChanged<int> onChanged, String label) {
return Column(
children: [
Container(
width: 80,
height: 150,
child: ListWheelScrollView(
itemExtent: 50,
perspective: 0.005,
diameterRatio: 1.2,
onSelectedItemChanged: onChanged,
children: items.map((value) {
return Center(
child: Text(
value.toString().padLeft(2, '0'),
style: TextStyle(
fontSize: 24,
color: value == selected ? Colors.blue : Colors.black,
),
),
);
}).toList(),
),
),
Text(label),
],
);
}
}
3. 使用原生HTML元素(适用于Web)
import 'package:flutter/material.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
class WebTimePicker extends StatelessWidget {
Future<void> _showTimePicker() async {
// 在Web端使用原生时间选择器
final html.InputElement input = html.InputElement(type: 'time');
input.step = '1'; // 启用秒选择
input.onChange.listen((e) {
if (input.value.isNotEmpty) {
print('选择的时间: ${input.value}');
}
});
input.click();
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _showTimePicker,
child: Text('选择时间'),
);
}
}
推荐方案
对于Web端的时分秒选择器,建议:
- 优先使用第三方库,如
time_range_picker
- 如果需要更精细的控制,可以自定义实现
- 考虑使用原生HTML元素以获得更好的Web兼容性
这些方案都能在Flutter Web中良好运行,选择哪种取决于具体需求和设计偏好。