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

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

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

简介

pub package Flutter Timeline List Web Demo

timeline_list 是一个高度可定制的Flutter小部件,用于显示带有自定义标记、图标和灵活定位选项的垂直时间线。

Flutter Timeline List Screenshot

注意:文档是使用大型语言模型创建的。如果您发现任何错误或拼写错误,请提交Pull Request或创建问题。

特性

  • 🎯 三种时间线位置:start(左侧)、center(居中)或end(右侧)
  • 🎨 完全可定制的标记,可以使用任何小部件作为内容或图标
  • 📍 灵活的图标对齐方式:topcenterbottom标记
  • 🎯 中心时间线的单个标记定位
  • 🔃 支持反转时间线顺序
  • 📱 自定义滚动物理和控制器支持

安装

在您的项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  timeline_list: ^0.1.0

然后运行 flutter pub get 来安装包。

使用方法

简单的时间线

这是一个简单的例子,展示了如何创建一个基本的时间线:

Flutter Simple Timeline List Screenshot

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

class SimpleTimeline extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Simple timeline")),
      body: Timeline(
        children: [
          Marker(child: Text("Step 1")),
          Marker(child: Text("Step 2")),
          Marker(child: Text("Step 3"))
        ],
      ),
    );
  }
}

引导示例

这是一个更高级的例子,展示了带有自定义图标的引导时间线:

Flutter Onboarding Timeline List Screenshot

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.blue, useMaterial3: true),
      initialRoute: '/',
      routes: {
        '/': (context) => ExampleDirectory(),
        '/onboarding': (context) => OnboardingPage(),
        '/simple': (context) => SimpleTimeline(),
      },
    );
  }
}

class OnboardingPage extends StatelessWidget {
  final checkIcon = Container(
    width: 16,
    height: 16,
    decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.green),
    child: Icon(Icons.check, color: Colors.white, size: 12),
  );

  final emptyIcon = Container(
    width: 16,
    height: 16,
    decoration: BoxDecoration(shape: BoxShape.circle, color: Colors.grey),
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Onboarding example")),
      body: Column(children: [
        Timeline.builder(
          context: context,
          markerCount: 10,
          properties: TimelineProperties(
            iconAlignment: MarkerIconAlignment.center,
            iconSize: 16,
            timelinePosition: TimelinePosition.start,
          ),
          markerBuilder: (context, index) => Marker(
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text("Step ${index + 1}"),
            ),
            icon: index >= 8 ? emptyIcon : checkIcon,
            position: MarkerPosition.left,
          ),
        ),
      ]),
    );
  }
}

class SimpleTimeline extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Simple timeline")),
      body: Timeline(
        children: [
          Marker(child: Text("Step 1")),
          Marker(child: Text("Step 2")),
          Marker(child: Text("Step 3"))
        ],
      ),
    );
  }
}

class ExampleDirectory extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Timeline Examples")),
      body: ListView(children: [
        ListTile(
          title: Text("Onboarding example"),
          onTap: () => Navigator.pushNamed(context, '/onboarding'),
        ),
        ListTile(
          title: Text("Simple timeline"),
          onTap: () => Navigator.pushNamed(context, '/simple'),
        ),
      ]),
    );
  }
}

自定义选项

时间线属性

  • timelinePosition: 控制整体时间线位置 (start, center, end)
  • iconAlignment: 设置图标相对于标记内容的对齐方式
  • iconSize: 定义标记图标的大小
  • lineWidth: 设置连接线的宽度
  • lineColor: 自定义连接线的颜色
  • itemGap: 控制标记之间的间距
  • iconGap: 设置图标与标记内容之间的间距

标记属性

  • child: 标记的主要内容小部件
  • icon: 可选的自定义图标小部件
  • position: 中心时间线的标记位置 (left, right)
  • onTap: 可选的标记点击事件回调
  • maxWidth: 标记内容的最大宽度约束

示例代码

完整的示例代码可以在 GitHub仓库 中找到,包括:

  • 带有自定义图标和小部件的完整功能时间线
  • 简单的引导流程

希望这些信息能帮助您更好地理解和使用 timeline_list 插件!如果有任何问题或需要进一步的帮助,请随时提问。


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

1 回复

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


当然,以下是如何在Flutter中使用timeline_list插件来展示时间线的一个示例。timeline_list是一个流行的Flutter插件,用于创建时间线视图。为了演示这个插件的使用,我们需要先确保在pubspec.yaml文件中添加了该插件的依赖项。

1. 添加依赖项

在你的pubspec.yaml文件中,添加以下依赖项:

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

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

2. 使用TimelineList

下面是一个完整的示例代码,展示了如何使用timeline_list插件来创建一个简单的时间线视图。

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

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

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

class TimelineScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final List<TimelineEvent> events = [
      TimelineEvent(
        title: 'Event 1',
        description: 'This is the first event in the timeline.',
        icon: Icons.event,
        color: Colors.blue,
        time: DateTime.now().subtract(Duration(days: 1)),
      ),
      TimelineEvent(
        title: 'Event 2',
        description: 'This is the second event in the timeline.',
        icon: Icons.star,
        color: Colors.green,
        time: DateTime.now(),
      ),
      TimelineEvent(
        title: 'Event 3',
        description: 'This is the third event in the timeline.',
        icon: Icons.announcement,
        color: Colors.red,
        time: DateTime.now().add(Duration(days: 1)),
      ),
    ];

    return Scaffold(
      appBar: AppBar(
        title: Text('Timeline List Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: TimelineList(
          events: events,
          indicatorStyle: TimelineIndicatorStyle(
            color: Colors.grey[400]!,
            size: 4.0,
          ),
          lineStyle: TimelineLineStyle(
            color: Colors.grey[400]!,
            thickness: 2.0,
          ),
          dotStyle: TimelineDotStyle(
            color: Colors.grey[600]!,
            size: 12.0,
          ),
          connectorLineStyle: TimelineConnectorLineStyle(
            color: Colors.grey[400]!,
            thickness: 2.0,
            length: 30.0,
          ),
          eventCardStyle: TimelineEventCardStyle(
            margin: EdgeInsets.symmetric(vertical: 8.0),
            elevation: 4.0,
            borderRadius: BorderRadius.circular(12.0),
          ),
          eventContentBuilder: (context, event) {
            return Card(
              shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.circular(12.0),
              ),
              elevation: 4.0,
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Row(
                      children: [
                        Icon(event.icon, color: event.color),
                        SizedBox(width: 8.0),
                        Text(event.title, style: TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold)),
                      ],
                    ),
                    SizedBox(height: 8.0),
                    Text(event.description, style: TextStyle(fontSize: 14.0)),
                    SizedBox(height: 8.0),
                    Text('Date: ${event.time.toLocal()}', style: TextStyle(fontSize: 12.0, color: Colors.grey)),
                  ],
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

class TimelineEvent {
  final String title;
  final String description;
  final IconData icon;
  final Color color;
  final DateTime time;

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

3. 解释

  • TimelineEvent 类:定义了一个事件模型,包含标题、描述、图标、颜色和日期时间。
  • TimelineScreen 类:构建了一个包含时间线列表的页面。
  • TimelineList:使用TimelineList小部件来显示事件列表。
    • indicatorStyle:定义时间线指示器的样式。
    • lineStyle:定义时间线的样式。
    • dotStyle:定义时间线点的样式。
    • connectorLineStyle:定义连接线的样式。
    • eventCardStyle:定义事件卡片的样式。
    • eventContentBuilder:自定义事件内容的构建器。

这个示例展示了如何使用timeline_list插件来创建一个包含多个事件的时间线视图。你可以根据需要自定义事件的内容和样式。

回到顶部