Flutter时间选择插件xb_time_ruler的使用
Flutter时间选择插件xb_time_ruler的使用
可能是你用过的最丝滑的卡尺时间选择器
![xb_time_ruler.gif](https://github.com/huisedediao/xb_time_ruler/raw/main/xb_time_ruler.gif)
安装
flutter pub add xb_time_ruler
使用
以下是一个完整的示例代码,展示了如何在Flutter应用中使用xb_time_ruler
插件。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:xb_time_ruler/xb_time_ruler.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
[@override](/user/override)
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final GlobalKey<XBTimeRulerPlaybackState> _globalKey = GlobalKey();
final int _alpha = 80;
late final List<XBTimeRulerArea> _areas;
[@override](/user/override)
void initState() {
super.initState();
_areas = [
XBTimeRulerArea(
startOffsetPercent: 0.1,
endOffsetPercent: 0.2,
color: Colors.blue.withAlpha(_alpha)),
XBTimeRulerArea(
startOffsetPercent: 0.4,
endOffsetPercent: 0.6,
color: Colors.blue.withAlpha(_alpha)),
XBTimeRulerArea(
startOffsetPercent: 0.7,
endOffsetPercent: 1.0,
color: Colors.red.withAlpha(_alpha))
];
}
bool isInAvailable(double value) {
bool ret = false;
for (var element in _areas) {
if (element.isAvailable && element.isInSide(value)) {
ret = true;
break;
}
}
return ret;
}
XBTimeRulerArea? findFirstAvailable() {
for (var element in _areas) {
if (element.isAvailable) {
return element;
}
}
return null;
}
int fingers = 0;
Timer? delayTimer;
double? percent;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('xb_time_ruler 示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
XBTimeRulerPlayback(
needCropper: true,
initCropperStartPercent: 0.15,
initCropperEndPercent: 0.22,
// coverLeftImg: "assets/images/arrow_left.png",
// coverRightImg: "assets/images/arrow_right.png",
key: _globalKey,
initOffsetPercent: 0.2,
onChanged: (value) {
// 打印百分比更新
print("百分比更新:$value");
percent = value;
},
onScrollEnd: (value) {
percent = value;
scrollIfNeed();
},
onFingersChanged: (value) {
fingers = value;
if (fingers != 0) {
delayTimer?.cancel();
} else {
scrollIfNeed();
}
},
areas: _areas),
const SizedBox(
height: 40,
),
GestureDetector(
onTap: () {
// 打印当前覆盖百分比范围
print(_globalKey.currentState?.coverPercentRange);
},
child: Container(
color: Colors.purple,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Text("获取百分比"),
),
)),
GestureDetector(
onTap: () {
// 更改最大偏移百分比为0.8
_globalKey.currentState?.updateMaxOffsetPercent(0.8);
},
child: Container(
color: Colors.green,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Text("更改最大偏移百分比为0.8"),
),
)),
GestureDetector(
onTap: () {
// 更改最大偏移百分比为0.6
_globalKey.currentState?.updateMaxOffsetPercent(0.6);
},
child: Container(
color: Colors.red,
child: const Padding(
padding: EdgeInsets.all(8.0),
child: Text("更改最大偏移百分比为0.6"),
),
))
],
)),
),
);
}
scrollIfNeed() {
if (percent == null) return;
final available = isInAvailable(percent!);
if (!available) {
final first = findFirstAvailable();
if (first != null) {
delayTimer?.cancel(); // 取消上一个计时器
delayTimer = Timer(const Duration(milliseconds: 1000), () {
if (fingers == 0) {
_globalKey.currentState?.updatedOffsetPercent(first.startOffsetPercent);
}
});
}
}
}
[@override](/user/override)
void dispose() {
delayTimer?.cancel();
super.dispose();
}
}
更多关于Flutter时间选择插件xb_time_ruler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter时间选择插件xb_time_ruler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用xb_time_ruler
时间选择插件的一个基本示例。xb_time_ruler
是一个自定义的时间选择组件,可以帮助用户在Flutter应用中方便地选择时间。
首先,你需要在你的pubspec.yaml
文件中添加xb_time_ruler
依赖项:
dependencies:
flutter:
sdk: flutter
xb_time_ruler: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中导入并使用xb_time_ruler
。以下是一个完整的示例,展示了如何在一个简单的Flutter应用中实现时间选择功能:
import 'package:flutter/material.dart';
import 'package:xb_time_ruler/xb_time_ruler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Time Picker Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: TimePickerScreen(),
);
}
}
class TimePickerScreen extends StatefulWidget {
@override
_TimePickerScreenState createState() => _TimePickerScreenState();
}
class _TimePickerScreenState extends State<TimePickerScreen> {
DateTime? selectedTime;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Time Picker Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
selectedTime == null
? 'No time selected'
: 'Selected Time: ${selectedTime!.toLocal()}',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
showModalBottomSheet(
context: context,
builder: (context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: XbTimeRuler(
onConfirm: (time) {
Navigator.of(context).pop();
setState(() {
selectedTime = time;
});
},
// 其他可选参数
minTime: DateTime(2023, 1, 1, 0, 0),
maxTime: DateTime(2023, 12, 31, 23, 59),
initTime: DateTime.now(),
),
);
},
);
},
child: Text('Select Time'),
),
],
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮,点击按钮后会弹出一个底部表单(BottomSheet
),显示XbTimeRuler
时间选择器。用户选择时间后,时间选择器的onConfirm
回调函数会被触发,并将选择的时间设置到selectedTime
状态变量中,然后更新UI显示选择的时间。
请注意,XbTimeRuler
的具体API和参数可能会随着版本的更新而有所变化,因此请参考插件的官方文档或GitHub仓库以获取最新的使用方法和参数说明。