Flutter时间控制器插件gg_time_controller的使用

Flutter时间控制器插件gg_time_controller的使用

GgTimeController 是一个用于媒体播放器的时间控制器插件,支持 playpausestopjumpToanimateTo 方法。

特性

在媒体播放器应用中(如视频播放器),时间控制功能是必需的。我们需要能够播放、停止、快进和后退时间。这正是 GgTimeController 实现的功能。

  • 按帧传递时间戳
  • 开始、停止和暂停时传递时间戳
  • 使用 animateTojumpTo 跳转或动画到指定时间

示例

以下是一个完整的示例,演示了如何使用 GgTimeController

import 'dart:async';

import 'package:gg_time_controller/gg_time_controller.dart';
import 'package:gg_typedefs/gg_typedefs.dart';

void main() async {
  void log(String str) => print('\n$str:');
  final fiveFrames = Duration(
    microseconds: ((GgTimeController.defaultFrameDuration * 5 * 1000 * 1000).toInt()),
  );

  /// 监听时间戳
  void onTimeStamp(GgMilliseconds timeStamp) {
    scheduleMicrotask(
      () => print('    time: $timeStamp'),
    );
  }

  /// 监听状态变化
  void onStateChange(GgTransportState state) {
    print('  state: ${state.toString().split('.').last}');
  }

  log('创建时间控制器');
  final timeController = GgTimeController(onTimeStamp: onTimeStamp);
  timeController.state.listen(onStateChange);

  log('开始播放');
  timeController.play();

  log('等待五个帧');
  await Future<void>.delayed(fiveFrames);

  // 输出:
  //   state: playing
  //     time: 17
  //     time: 33
  //     time: 49
  //     time: 64
  //     time: 81

  log('暂停播放');
  timeController.pause();

  // 输出:
  //   time: 85

  log('等待五个帧 => 因为控制器已暂停,所以无输出');
  await Future<void>.delayed(fiveFrames);

  // 输出:
  //   state: paused

  log('停止控制器。时间将重置为0');
  timeController.stop();
  await Future<void>.delayed(Duration.zero);

  // 输出:
  //   state: stopped
  //     time: 0

  log('跳转到10秒');
  timeController.jumpTo(time: 10.0);
  await Future<void>.delayed(Duration.zero);

  // 输出:
  //   time: 1000000

  log('现在再次播放');
  timeController.play();

  log('等待五个帧');

  await Future<void>.delayed(fiveFrames);
  timeController.pause();

  // 输出:
  //     time: 10017
  //     time: 10033
  //     time: 10050
  //     time: 10065
  //     time: 10082
  //     time: 10083
  //   state: paused
  //     time: 11947

  log('在100毫秒内动画到20秒');
  await timeController.animateTo(
    targetTime: 20.0,
    animationDuration: 0.1,
  );
  await Future<void>.delayed(fiveFrames);

  // 输出:
  //   state: animatingForward
  //     time: 13578
  //     time: 15107
  //     time: 16736
  //     time: 18255
  //     time: 19879
  //     time: 20000

  log('在100毫秒内动画回10秒');
  await timeController.animateTo(
    targetTime: 10.0,
    animationDuration: 0.1,
  );

  // 输出:
  //   state: paused
  //   state: animatingBackward
  //     time: 18179
  //     time: 16644
  //     time: 15001
  //     time: 13365
  //     time: 11825
  //     time: 10168
  //     time: 10000
  //   state: paused
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用gg_time_controller插件的示例代码。这个插件通常用于选择时间,类似于一个时间选择器。

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

dependencies:
  flutter:
    sdk: flutter
  gg_time_controller: ^latest_version  # 请替换为实际的最新版本号

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

接下来,在你的Flutter项目中使用这个插件。下面是一个简单的示例,展示如何在一个页面中集成并使用gg_time_controller

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Time Controller Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TimePickerScreen(),
    );
  }
}

class TimePickerScreen extends StatefulWidget {
  @override
  _TimePickerScreenState createState() => _TimePickerScreenState();
}

class _TimePickerScreenState extends State<TimePickerScreen> {
  DateTime _selectedTime = DateTime.now();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Time Picker Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Selected Time: ${_selectedTime.toLocal()}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                showTimePicker(
                  context: context,
                  initialTime: _selectedTime,
                  onConfirm: (selectedTime) {
                    setState(() {
                      _selectedTime = selectedTime;
                    });
                  },
                );
              },
              child: Text('Pick a Time'),
            ),
          ],
        ),
      ),
    );
  }

  // 使用gg_time_controller的时间选择器对话框
  Future<void> showTimePicker({
    required BuildContext context,
    required DateTime initialTime,
    required ValueChanged<DateTime> onConfirm,
  }) async {
    final TimeControllerController controller = TimeControllerController(
      initialTime: initialTime,
      onConfirm: onConfirm,
    );

    await showDialog<void>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Select Time'),
          content: GGTimeController(
            controller: controller,
          ),
          actions: <Widget>[
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text('Cancel'),
            ),
            TextButton(
              onPressed: () {
                controller.confirm();
                Navigator.of(context).pop();
              },
              child: Text('Confirm'),
            ),
          ],
        );
      },
    );
  }
}

解释

  1. 依赖项:在pubspec.yaml中添加gg_time_controller依赖。
  2. 主应用:在MyApp类中设置基本的MaterialApp。
  3. 时间选择器页面:在TimePickerScreen类中创建一个包含时间显示和按钮的页面。
  4. 时间选择器对话框:定义一个showTimePicker方法,该方法使用gg_time_controllerGGTimeController小部件来创建一个自定义的时间选择器对话框。

请注意,gg_time_controller的具体使用方式可能会根据插件的最新版本有所不同,因此请务必查阅插件的官方文档或源代码以获取最新的使用方法和API。如果插件的API有所变动,上面的代码可能需要做相应的调整。

回到顶部