Flutter时间线展示插件scrollable_timeline的使用

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

Flutter时间线展示插件scrollable_timeline的使用

概述

scrollable_timeline 是一个可以滚动和拖动的时间轴小部件,可以通过外部时间流驱动。例如,它可以用于显示当前正在播放的YouTube视频的时间。多个时间轴可以保持同步,并在任意一个时间轴被拖动时自动停止。

示例

这里有三个可运行的示例,已在移动设备和Web上进行了测试。以下是一个在Android设备上录制的最完整的示例:

示例代码链接

安装

安装方法可以在包页面的安装部分找到。

使用示例

ScrollableTimeline(
  lengthSecs: 100, // 总秒数
  stepSecs: 2, // 时间步长
  height: 120, // 时间轴的高度
  rulerOutsidePadding: 10, // 刻度线外边距
  showCursor: true, // 是否显示中央游标
  showMinutes: true, // 是否显示分钟和秒
  backgroundColor: Colors.lightBlue.shade50, // 背景色
  activeItemTextColor: Colors.blue.shade800, // 活动项文本颜色
  itemTextColor: Colors.blue.shade300, // 文本颜色
  onDragEnd: (double t) {
    print("*FLT* drag detected for ScrollableTimelineF to target time $t");
  } // 拖动结束回调
)

构造函数参数参考

参数 默认值 描述
height double 时间轴的高度
backgroundColor Colors.white 时间轴的背景色
lengthSecs int 显示在时间轴上的总秒数
stepSecs int 时间轴上各项目之间的步长
shownSecsMultiples 1 int 显示刻度线之间的时间间隔
itemExtent 60 int 每个时间标记项目的宽度(包含分钟和秒的文本)
itemTextColor Colors.grey Color 时间轴上分钟和秒文本的颜色
showMinutes true bool 是否同时显示分钟和秒
showCursor true bool 是否显示中央游标指示当前选中的时间
cursorColor Colors.red Color 中央游标指示当前选中的时间的颜色
rulerSize 8 double 刻度线的大小
rulerOutsidePadding 10 double 刻度线的外边距:顶部用于顶部刻度线,底部用于底部刻度线
rulerInsidePadding 5 double 刻度线的内边距:底部用于顶部刻度线,顶部用于底部刻度线
timeStream null Stream? 可选的时间值流。当接收到一个值时,时间轴会滚动到该时间值。
onDragStart 回调当用户开始拖动时间轴时,用当前时间值调用。拖动状态下忽略时间流更新。
onDragEnd 回调当用户停止拖动时间轴时,用选中的时间值调用。

参数图例

  1. 刻度线外边距
  2. 刻度线大小
  3. 刻度线内边距
  4. 分钟文本
  5. 秒文本
  6. 每个时间标记项目的宽度
  7. 游标

许可证

版权 2022 Dario Elyasy,根据BSD 3-Clause License授权。

示例代码

import 'package:flutter/material.dart';

import 'pages/basic_example_page.dart';
import 'pages/expandable_example_page.dart';
import 'pages/youtube_example_page.dart';

void main() => runApp(MyApp());

class RouteNames {
  static const String root = "/";
  static const String simple = "/simple";
  static const String expandable = "/expandable";
  static const String youtube = "/youtube";
}

class MyApp extends StatelessWidget {
  // 这是你的应用的根小部件。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Scrollable Timeline Demo',
      initialRoute: RouteNames.root,
      routes: {
        RouteNames.root: (context) => MainScreen(),
        RouteNames.simple: (context) => BasicExamplePage(),
        RouteNames.expandable: (context) => ExpandableExamplePage(),
        RouteNames.youtube: (context) => YoutubeExamplePage(),
      },
      debugShowCheckedModeBanner: true,
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
    );
  }
}

class MainScreen extends StatelessWidget {
  final ButtonStyle btnStyle = ElevatedButton.styleFrom(
    textStyle: const TextStyle(fontSize: 20),
    backgroundColor: Colors.green,
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("ScrollableTimeline example")),
      body: Center(
        child: Column(
          children: [
            const SizedBox(height: 10),
            ElevatedButton(
              style: btnStyle,
              onPressed: () {
                Navigator.pushNamed(context, RouteNames.simple);
              },
              child: Text("简单示例"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              style: btnStyle,
              onPressed: () {
                Navigator.pushNamed(context, RouteNames.expandable);
              },
              child: Text("可展开示例"),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              style: btnStyle,
              onPressed: () {
                Navigator.pushNamed(context, RouteNames.youtube);
              },
              child: Text("YouTube示例"),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用scrollable_timeline插件来展示时间线的示例代码。这个插件可以帮助你创建一个可滚动的时间线视图,非常适合展示历史数据或事件。

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

dependencies:
  flutter:
    sdk: flutter
  scrollable_timeline: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤创建一个时间线视图:

  1. 导入必要的包。
  2. 创建一个时间线数据模型。
  3. 使用ScrollableTimeline组件来展示时间线。

以下是完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Scrollable Timeline Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TimelineScreen(),
    );
  }
}

class TimelineScreen extends StatelessWidget {
  // 创建一个时间线数据模型
  final List<TimelineEvent> timelineEvents = [
    TimelineEvent(
      title: 'Event 1',
      date: DateTime(2023, 1, 1),
      description: 'This is the first event.',
      color: Colors.blue,
    ),
    TimelineEvent(
      title: 'Event 2',
      date: DateTime(2023, 3, 15),
      description: 'This is the second event.',
      color: Colors.green,
    ),
    TimelineEvent(
      title: 'Event 3',
      date: DateTime(2023, 6, 10),
      description: 'This is the third event.',
      color: Colors.orange,
    ),
    // 可以添加更多事件
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Scrollable Timeline Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: ScrollableTimeline(
          events: timelineEvents,
          eventBuilder: (context, event) {
            return TimelineCard(
              title: Text(event.title),
              date: Text(DateFormat('MMMM d, yyyy').format(event.date)),
              content: Text(event.description),
              color: event.color,
            );
          },
          connectorBuilder: (context, event, previousEvent, nextEvent) {
            return TimelineConnector(
              color: event.color,
              lineWidth: 4.0,
              lineType: TimelineConnectorType.continuous,
            );
          },
        ),
      ),
    );
  }
}

// 定义时间线事件的数据模型
class TimelineEvent {
  final String title;
  final DateTime date;
  final String description;
  final Color color;

  TimelineEvent({
    required this.title,
    required this.date,
    required this.description,
    required this.color,
  });
}

// 自定义时间线卡片
class TimelineCard extends StatelessWidget {
  final String title;
  final String date;
  final String content;
  final Color color;

  TimelineCard({
    required this.title,
    required this.date,
    required this.content,
    required this.color,
  });

  @override
  Widget build(BuildContext context) {
    return Card(
      color: color,
      elevation: 4.0,
      margin: EdgeInsets.symmetric(vertical: 16.0),
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(16.0),
      ),
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              title,
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            SizedBox(height: 8.0),
            Text(
              date,
              style: TextStyle(fontSize: 14, color: Colors.grey),
            ),
            SizedBox(height: 16.0),
            Text(
              content,
              style: TextStyle(fontSize: 16),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们定义了一个TimelineEvent类来表示时间线中的每个事件,并创建了一个包含这些事件的列表。然后,我们使用ScrollableTimeline组件来展示这些事件,每个事件通过eventBuilder回调来构建自定义的TimelineCard

TimelineCard是一个简单的卡片组件,包含了事件的标题、日期和描述,以及一个自定义的背景颜色。

希望这个示例能帮你理解如何在Flutter中使用scrollable_timeline插件来创建时间线视图。

回到顶部