aves/lib/widgets/common/grid/sections/provider.dart
2022-09-24 18:42:03 +02:00

104 lines
4 KiB
Dart

import 'package:aves/model/source/enums/enums.dart';
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:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:provider/provider.dart';
typedef CoverRatioResolver<T> = double Function(T item);
abstract class SectionedListLayoutProvider<T> extends StatelessWidget {
final double scrollableWidth;
final TileLayout tileLayout;
final int columnCount;
final double spacing, horizontalPadding, tileWidth, tileHeight;
final Widget Function(T item) tileBuilder;
final Duration tileAnimationDelay;
final CoverRatioResolver<T> 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<SectionedListLayout<T>>(
update: (context, _) {
switch (tileLayout) {
case TileLayout.mosaic:
return MosaicSectionLayoutBuilder<T>(
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<T>(
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<SectionKey, List<T>> 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', 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<bool>('showHeaders', showHeaders));
}
}