Flutter时间选择插件xb_time_ruler的使用

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

Flutter时间选择插件xb_time_ruler的使用

可能是你用过的最丝滑的卡尺时间选择器

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

1 回复

更多关于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仓库以获取最新的使用方法和参数说明。

回到顶部