import 'package:aves/model/source/section_keys.dart'; import 'package:aves/widgets/common/grid/sections/fixed/section_layout_builder.dart'; import 'package:aves/widgets/common/grid/sections/list_layout.dart'; import 'package:aves/widgets/common/grid/sections/mosaic/section_layout_builder.dart'; import 'package:aves/widgets/common/grid/sections/section_layout_builder.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:provider/provider.dart'; typedef CoverRatioResolver = double Function(T item); abstract class SectionedListLayoutProvider extends StatelessWidget { final double scrollableWidth; final TileLayout tileLayout; final int columnCount; final double spacing, horizontalPadding, tileWidth, tileHeight; final TileBuilder tileBuilder; final Duration tileAnimationDelay; final CoverRatioResolver coverRatioResolver; final Widget child; const SectionedListLayoutProvider({ super.key, required this.scrollableWidth, required this.tileLayout, required int columnCount, required this.spacing, required this.horizontalPadding, required double tileWidth, required this.tileHeight, required this.tileBuilder, required this.tileAnimationDelay, required this.coverRatioResolver, required this.child, }) : assert(scrollableWidth != 0), columnCount = tileLayout == TileLayout.list ? 1 : columnCount, tileWidth = tileLayout == TileLayout.list ? scrollableWidth - (horizontalPadding * 2) : tileWidth; @override Widget build(BuildContext context) { return ProxyProvider0>( update: (context, _) { switch (tileLayout) { case TileLayout.mosaic: return MosaicSectionLayoutBuilder( sections: sections, showHeaders: showHeaders, getHeaderExtent: getHeaderExtent, buildHeader: buildHeader, scrollableWidth: scrollableWidth, tileLayout: tileLayout, columnCount: columnCount, spacing: spacing, horizontalPadding: horizontalPadding, tileWidth: tileWidth, tileHeight: tileHeight, tileBuilder: tileBuilder, tileAnimationDelay: tileAnimationDelay, coverRatioResolver: coverRatioResolver, ).updateLayouts(context); case TileLayout.grid: case TileLayout.list: return FixedExtentSectionLayoutBuilder( sections: sections, showHeaders: showHeaders, buildHeader: buildHeader, getHeaderExtent: getHeaderExtent, scrollableWidth: scrollableWidth, tileLayout: tileLayout, columnCount: columnCount, spacing: spacing, horizontalPadding: horizontalPadding, tileWidth: tileWidth, tileHeight: tileHeight, tileBuilder: tileBuilder, tileAnimationDelay: tileAnimationDelay, ).updateLayouts(context); } }, child: child, ); } bool get showHeaders; Map> get sections; double getHeaderExtent(BuildContext context, SectionKey sectionKey); Widget buildHeader(BuildContext context, SectionKey sectionKey, double headerExtent); @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add(DoubleProperty('scrollableWidth', scrollableWidth)); properties.add(EnumProperty('tileLayout', tileLayout)); properties.add(IntProperty('columnCount', columnCount)); properties.add(DoubleProperty('spacing', spacing)); properties.add(DoubleProperty('horizontalPadding', horizontalPadding)); properties.add(DoubleProperty('tileWidth', tileWidth)); properties.add(DoubleProperty('tileHeight', tileHeight)); properties.add(DiagnosticsProperty('showHeaders', showHeaders)); } }