# timelines **Repository Path**: onlymry/timelines ## Basic Information - **Project Name**: timelines - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-08-18 - **Last Updated**: 2021-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [![banner](https://raw.github.com/chulwoo-park/timelines/main/design/feature_graphic.png)](https://github.com/chulwoo-park/timelines)

Pub Awesome Flutter License: MIT

A powerful & easy to use timeline package for Flutter! 🚀

> ***Caveat***: This package is an early stage. Not enough testing has been done to guarantee stability. Some APIs may change. # Examples Check it out on the [web](https://chulwoo.dev/timelines/) or look at the [source code](https://github.com/chulwoo-park/timelines/tree/main/example). | Timeline status | Package delivery tracking | Process timeline | | - | - | - | | [![timeline_status](https://raw.github.com/chulwoo-park/timelines/main/screenshots/timeline_status.gif)](https://chulwoo.dev/timelines/#/timeline_status) | [![package_delivery_tracking.gif](https://raw.github.com/chulwoo-park/timelines/main/screenshots/package_delivery_tracking.gif)](https://chulwoo.dev/timelines/#/package_delivery_tracking) | [![process_timeline.gif](https://raw.github.com/chulwoo-park/timelines/main/screenshots/process_timeline.gif)](https://chulwoo.dev/timelines/#/process_timeline) |

More examples
🚧 WIP 🚧

# Features ### The [timeline](#timeline) and each [components](#components) are all WIDGET. * Common styles can be easily implemented with predefined components. * Vertical, horizontal direction. * Alternating contents. * Combination with Flutter widgets(Row, Column, CustomScrollView, etc). * Customize each range with themes. # Getting started - [Installation](#installation) - [Basic Usage](#basic-usage) - [Components](#components) - [Theme](#theme) - [Indicator](#indicator) - [Connector](#connector) - [TimelineNode](#timelinenode) - [TimelineTile](#timelinetile) - [Timeline](#timeline) - [TimelineTileBuilder](#timelinetilebuilder) ## Installation #### 1. Depend on it Add this to your package's pubspec.yaml file: ``` yaml dependencies: timelines: ^[latest_version] ``` #### 2. Install it You can install packages from the command line: with Flutter: ``` console $ flutter pub get ``` Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more. #### 3. Import it Now in your Dart code, you can use: ``` dart import 'package:timelines/timelines.dart'; ``` ## Basic Usage ``` dart @override Widget build(BuildContext context) { return Timeline.tileBuilder( builder: TimelineTileBuilder.fromStyle( contentsAlign: ContentsAlign.alternating, contentsBuilder: (context, index) => Padding( padding: const EdgeInsets.all(24.0), child: Text('Timeline Event $index'), ), itemCount: 10, ), ); } ``` Check the [Example](https://github.com/chulwoo-park/timelines/tree/main/example) or the [API reference](https://pub.dev/documentation/timelines/latest/) for more details. ## Components ### Theme Check out [Theme Demo](https://chulwoo.dev/timelines/#/theme) to see how the values inside TimelineTile work with the theme. To customize the timeline component with a theme, do the following: ``` dart TimelineTheme( data: TimelineThemeData(...), child: DotIndicator(...), ); ``` If you only want to change part of the parent theme, use `TimelineTheme.of(context)`: ``` dart TimelineTheme( data: TimelineThemeData.of(context).copyWith(...), child: DotIndicator(...), ); ``` If the component you want to customize is `Timeline` or `FixedTimeline`, this is also possible: ``` dart FixedTimeline( theme: TimelineThemeData(...), children: [...], ); ``` ### Indicator
ContainerIndicator
ContainerIndicator
ContainerIndicator(
  child: Container(
    width: 15.0,
    height: 15.0,
    color: Colors.blue,
  ),
)
DotIndicator
DotIndicator
DotIndicator()
OutlinedDotIndicator
OutlinedDotIndicator
OutlinedDotIndicator()
### Connector
SolidLineConnector
SolidLineConnector
SizedBox(
  height: 20.0,
  child: SolidLineConnector(),
)
DashedLineConnector
DashedLineConnector
SizedBox(
  height: 20.0,
  child: DashedLineConnector(),
)
DecoratedLineConnector
DecoratedLineConnector
SizedBox(
  height: 20.0,
  child: DecoratedLineConnector(
    decoration: BoxDecoration(
      gradient: LinearGradient(
        begin: Alignment.topCenter,
        end: Alignment.bottomCenter,
        colors: [Colors.blue, Colors.lightBlueAccent[100]],
      ),
    ),
  ),
)
### TimelineNode Pure timeline UI component with no content. The TimelineNode contains an indicator and two connectors on both sides of the indicator:
Simple TimelineNode
Simple TimelineNode
SizedBox(
  height: 50.0,
  child: TimelineNode.simple(),
)
Complex TimelineNode
Complex TimelineNode
SizedBox(
  height: 80.0,
  child: TimelineNode(
    indicator: Card(
      margin: EdgeInsets.zero,
      child: Padding(
        padding: EdgeInsets.all(8.0),
        child: Text('Complex'),
      ),
    ),
    startConnector: DashedLineConnector(),
    endConnector: SolidLineConnector(),
  ),
)
### TimelineTile Displays content on both sides of the node:
TimelineTile
TimelineTile
TimelineTile(
  oppositeContents: Padding(
    padding: const EdgeInsets.all(8.0),
    child: Text('opposite\ncontents'),
  ),
  contents: Card(
    child: Container(
      padding: EdgeInsets.all(8.0),
      child: Text('contents'),
    ),
  ),
  node: TimelineNode(
    indicator: DotIndicator(),
    startConnector: SolidLineConnector(),
    endConnector: SolidLineConnector(),
  ),
)
### TimelineTileBuilder TimelineTileBuilder provides powerful build features. #### Connection Each tile draws only half of the line connecting the neighboring tiles. Using the `connected` constructor, lines connecting adjacent tiles can build as one index.
ConnectionDirection.before
Connection direction before
FixedTimeline.tileBuilder(
  builder: TimelineTileBuilder.connectedFromStyle(
    connectionDirection: ConnectionDirection.before,
    connectorStyleBuilder: (context, index) {
      return (index == 1) ? ConnectorStyle.dashedLine : ConnectorStyle.solidLine;
    },
    indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
    itemExtent: 40.0,
    itemCount: 3,
  ),
)
ConnectionDirection.after
Connection direction after
FixedTimeline.tileBuilder(
  builder: TimelineTileBuilder.connectedFromStyle(
    connectionDirection: ConnectionDirection.after,
    connectorStyleBuilder: (context, index) {
      return (index == 1) ? ConnectorStyle.dashedLine : ConnectorStyle.solidLine;
    },
    indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
    itemExtent: 40.0,
    itemCount: 3,
  ),
)
#### ContentsAlign This value determines how the contents of the timeline will be built:
ContentsAlign.basic
Basic contents align
FixedTimeline.tileBuilder(
  builder: TimelineTileBuilder.connectedFromStyle(
    contentsAlign: ContentsAlign.basic,
    oppositeContentsBuilder: (context, index) => Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text('opposite\ncontents'),
    ),
    contentsBuilder: (context, index) => Card(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text('Contents'),
      ),
    ),
    connectorStyleBuilder: (context, index) => ConnectorStyle.solidLine,
    indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
    itemCount: 3,
  ),
)
ContentsAlign.reverse
Reverse contents align
FixedTimeline.tileBuilder(
  builder: TimelineTileBuilder.connectedFromStyle(
    contentsAlign: ContentsAlign.reverse,
    oppositeContentsBuilder: (context, index) => Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text('opposite\ncontents'),
    ),
    contentsBuilder: (context, index) => Card(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text('Contents'),
      ),
    ),
    connectorStyleBuilder: (context, index) => ConnectorStyle.solidLine,
    indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
    itemCount: 3,
  ),
)
ContentsAlign.alternating
Alternating contents align
FixedTimeline.tileBuilder(
  builder: TimelineTileBuilder.connectedFromStyle(
    contentsAlign: ContentsAlign.alternating,
    oppositeContentsBuilder: (context, index) => Padding(
      padding: const EdgeInsets.all(8.0),
      child: Text('opposite\ncontents'),
    ),
    contentsBuilder: (context, index) => Card(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text('Contents'),
      ),
    ),
    connectorStyleBuilder: (context, index) => ConnectorStyle.solidLine,
    indicatorStyleBuilder: (context, index) => IndicatorStyle.dot,
    itemCount: 3,
  ),
)
### Timeline The timeline component has two widgets, `Timeline` similar to ScrollView and `FixedTimeline` similar to Flex. Also their constructors are similar to ScrollView and Flex. The main difference is that they has TimelineTheme as an ancestor. The `tileBuilder` constructor provides more powerful features using [TimelineTileBuilder](https://pub.dev/documentation/timelines/latest/timelines/TimelineTileBuilder-class.html). If you don't need TimelineTileBuilder, you can use other flutter widgets like ListView, Column, Row, etc. Even if you use the flutter widget, you can use TimelineTheme. # Documentation See full [documentation](https://pub.dev/documentation/timelines/latest/) # Changelog See [CHANGELOG.md](https://github.com/chulwoo-park/timelines/blob/main/CHANGELOG.md). # Code of conduct See [CODE_OF_CONDUCT.md](https://github.com/chulwoo-park/timelines/blob/main/CODE_OF_CONDUCT.md). # License [MIT](https://github.com/chulwoo-park/timelines/blob/main/LICENSE)