Skip to content

Instantly share code, notes, and snippets.

@alefcarlos
Created March 6, 2019 01:34
Show Gist options
  • Select an option

  • Save alefcarlos/7f38a329b42b7096f310deefefa7057b to your computer and use it in GitHub Desktop.

Select an option

Save alefcarlos/7f38a329b42b7096f310deefefa7057b to your computer and use it in GitHub Desktop.
class _CollectionsListState extends State<CollectionsList> {
final _scrollController = ScrollController();
final _scrollThreshold = 200.0;
Completer<void> _refreshCompleter;
@override
void initState() {
_refreshCompleter = Completer<void>();
_scrollController.addListener(_onScroll);
widget._collectionsBloc.dispatch(CollectionsFetchEvent());
super.initState();
}
void _onScroll() {
final maxScroll = _scrollController.position.maxScrollExtent;
final currentScroll = _scrollController.position.pixels;
if (maxScroll - currentScroll <= _scrollThreshold) {
widget._collectionsBloc.dispatch(CollectionsFetchEvent(fromScroll: true));
}
}
@override
Widget build(BuildContext context) {
return BlocBuilder<BlocBaseEvent, BlocBaseState>(
bloc: widget._collectionsBloc,
builder: (BuildContext context, BlocBaseState state) {
if (state is BlocLoadingIndicatorState) {
return ShimmerList();
}
if (state is BlocErrorState) {
return RefreshIndicator(
onRefresh: _refreshData,
child: Empty(
text: Text(state.error),
),
);
}
if (state is CollectionsLoadedState) {
_refreshCompleter?.complete();
_refreshCompleter = Completer();
if (state.data.isEmpty) {
return RefreshIndicator(
onRefresh: _refreshData,
child: Empty(
text: Text('Você ainda não cadastrou nenhuma coleção.'),
),
);
}
return RefreshIndicator(
onRefresh: _refreshData,
child: ListView.builder(
itemBuilder: (context, index) {
if (index >= state.data.length) {
return BottomLoader();
}
return CollectionsListTile(
state.data[index], widget._collectionsBloc);
},
itemCount: state.hasReachedMax
? state.data.length
: state.data.length + 1,
controller: _scrollController,
),
);
}
},
);
}
Future<void> _refreshData() {
widget._collectionsBloc.dispatch(CollectionsFetchEvent());
return _refreshCompleter.future;
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment