80 lines
2.8 KiB
Dart
80 lines
2.8 KiB
Dart
import 'package:birzha/components/indicator.dart';
|
|
import 'package:birzha/components/postBuilderFactory.dart';
|
|
import 'package:birzha/components/refreshButton.dart';
|
|
import 'package:birzha/constants.dart';
|
|
import 'package:birzha/core/adaptix/adaptix.dart';
|
|
import 'package:birzha/models/categories/category.dart';
|
|
import 'package:birzha/models/products/post.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import '../core/lazyload/lazyload.dart';
|
|
|
|
class PostList extends StatefulWidget {
|
|
const PostList({Key? key, required this.category, required this.fetchController, this.contentPadding, this.before = const [], this.after = const []})
|
|
: super(key: key);
|
|
|
|
final Serializer category;
|
|
final FetchController<Post> fetchController;
|
|
final EdgeInsets? contentPadding;
|
|
final List<Widget> before;
|
|
final List<Widget> after;
|
|
|
|
@override
|
|
_PostListState createState() => _PostListState();
|
|
}
|
|
|
|
class _PostListState extends State<PostList> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ChangeNotifierProvider.value(
|
|
value: widget.fetchController,
|
|
child: LazyLoadView<Post>(
|
|
data: (page, context) => widget.category.getPosts(context, page),
|
|
loaderWidget: SliverFillRemaining(
|
|
child: Center(child: Indicator(size: 0.7.adaptedPx())),
|
|
),
|
|
loadMoreWidget: SliverToBoxAdapter(
|
|
child: Container(
|
|
margin: EdgeInsets.symmetric(vertical: 10.adaptedPx()),
|
|
alignment: Alignment.center,
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Center(child: Indicator(size: 0.6.adaptedPx())),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
before: [...widget.before],
|
|
after: [...widget.after],
|
|
fetchController: widget.fetchController,
|
|
contentPadding: widget.contentPadding ?? EdgeInsets.zero,
|
|
errorWidget: (refresh, error) {
|
|
return SliverFillRemaining(
|
|
child: Center(
|
|
child: RefreshButton(
|
|
onTap: refresh,
|
|
size: 38.adaptedPx(),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
gridDelegate: widget.category.gridDelegate(context),
|
|
errorOnLoadMoreWidget: (refresh, error) {
|
|
return Container(
|
|
margin: EdgeInsets.symmetric(vertical: 10.adaptedPx()),
|
|
child: RefreshButton(
|
|
onTap: refresh,
|
|
size: 25.adaptedPx(),
|
|
),
|
|
);
|
|
},
|
|
pageFactor: AppConstants.pageLimit,
|
|
needPagination: widget.category.needPagination,
|
|
itemBuilder: (context, model, index) => PostBuilderFactory(post: model)),
|
|
);
|
|
}
|
|
}
|