TimelineTileBuilder constructor

TimelineTileBuilder({
  1. required int itemCount,
  2. ContentsAlign contentsAlign = ContentsAlign.basic,
  3. NullableIndexedWidgetBuilder? contentsBuilder,
  4. NullableIndexedWidgetBuilder? oppositeContentsBuilder,
  5. NullableIndexedWidgetBuilder? indicatorBuilder,
  6. NullableIndexedWidgetBuilder? startConnectorBuilder,
  7. NullableIndexedWidgetBuilder? endConnectorBuilder,
  8. double? itemExtent,
  9. IndexedValueBuilder<double>? itemExtentBuilder,
  10. IndexedValueBuilder<double>? nodePositionBuilder,
  11. IndexedValueBuilder<bool?>? nodeItemOverlapBuilder,
  12. IndexedValueBuilder<double>? indicatorPositionBuilder,
  13. IndexedValueBuilder<TimelineThemeData>? themeBuilder,
})

Create a tile builder, which builds tiles using each component builder.

If each item has a fixed extent, use itemExtent, and if each item has a different extent, use itemExtentBuilder.

TODO: need refactoring, is it has many builders...?

Implementation

factory TimelineTileBuilder({
  required int itemCount,
  ContentsAlign contentsAlign = ContentsAlign.basic,
  NullableIndexedWidgetBuilder? contentsBuilder,
  NullableIndexedWidgetBuilder? oppositeContentsBuilder,
  NullableIndexedWidgetBuilder? indicatorBuilder,
  NullableIndexedWidgetBuilder? startConnectorBuilder,
  NullableIndexedWidgetBuilder? endConnectorBuilder,
  double? itemExtent,
  IndexedValueBuilder<double>? itemExtentBuilder,
  IndexedValueBuilder<double>? nodePositionBuilder,
  IndexedValueBuilder<bool?>? nodeItemOverlapBuilder,
  IndexedValueBuilder<double>? indicatorPositionBuilder,
  IndexedValueBuilder<TimelineThemeData>? themeBuilder,
}) {
  assert(
    itemExtent == null || itemExtentBuilder == null,
    'Cannot provide both a itemExtent and a itemExtentBuilder.',
  );

  final effectiveContentsBuilder = _createAlignedContentsBuilder(
    align: contentsAlign,
    contentsBuilder: contentsBuilder,
    oppositeContentsBuilder: oppositeContentsBuilder,
  );
  final effectiveOppositeContentsBuilder = _createAlignedContentsBuilder(
    align: contentsAlign,
    contentsBuilder: oppositeContentsBuilder,
    oppositeContentsBuilder: contentsBuilder,
  );

  return TimelineTileBuilder._(
    (context, index) {
      final tile = TimelineTile(
        mainAxisExtent: itemExtent ?? itemExtentBuilder?.call(context, index),
        node: TimelineNode(
          indicator: indicatorBuilder?.call(context, index) ??
              Indicator.transparent(),
          startConnector: startConnectorBuilder?.call(context, index),
          endConnector: endConnectorBuilder?.call(context, index),
          overlap: nodeItemOverlapBuilder?.call(context, index),
          position: nodePositionBuilder?.call(context, index),
          indicatorPosition: indicatorPositionBuilder?.call(context, index),
        ),
        contents: effectiveContentsBuilder(context, index),
        oppositeContents: effectiveOppositeContentsBuilder(context, index),
      );

      final theme = themeBuilder?.call(context, index);
      if (theme != null) {
        return TimelineTheme(
          data: theme,
          child: tile,
        );
      } else {
        return tile;
      }
    },
    itemCount: itemCount,
  );
}