@@ -4,21 +4,18 @@ import 'package:flutter/material.dart';
44import 'package:katswiri/custom_widgets/custom_widgets.dart' ;
55import 'package:katswiri/models/models.dart' ;
66import 'package:katswiri/sources/sources.dart' ;
7- import 'package:katswiri/utils/utils.dart' ;
87
98class JobListRetriever extends StatefulWidget {
109 const JobListRetriever ({
1110 super .key,
1211 required this .source,
1312 this .filter,
1413 this .primary,
15- this .sortJobs = true ,
1614 });
1715
1816 final Source source;
1917 final Map <String , String >? filter;
2018 final bool ? primary;
21- final bool sortJobs;
2219
2320 @override
2421 State <JobListRetriever > createState () => _JobListRetrieverState ();
@@ -33,7 +30,7 @@ class _JobListRetrieverState extends State<JobListRetriever>
3330 bool _loading = true ;
3431 bool _hasError = false ;
3532 String _errMsg = '' ;
36- bool _showButton = false ;
33+ bool _showScrollTop = false ;
3734
3835 late final StreamController <List <Job >> _streamController =
3936 StreamController .broadcast ();
@@ -79,15 +76,14 @@ class _JobListRetrieverState extends State<JobListRetriever>
7976 stream: _streamController.stream,
8077 builder: _builder,
8178 ),
82- if (_showButton)
83- Positioned (
84- bottom: 16 ,
85- right: 16 ,
86- child: FloatingActionButton (
87- onPressed: _scrollToTop,
88- child: const Icon (Icons .arrow_upward),
89- ),
79+ Positioned (
80+ right: 16.0 ,
81+ bottom: 16.0 ,
82+ child: _ScrollToTop (
83+ onPressed: _scrollToTop,
84+ showScrollTop: _showScrollTop,
9085 ),
86+ ),
9187 ],
9288 );
9389 }
@@ -134,7 +130,6 @@ class _JobListRetrieverState extends State<JobListRetriever>
134130 controller: _scrollController,
135131 padding: const EdgeInsets .only (top: 4.0 ),
136132 primary: widget.primary,
137- shrinkWrap: true ,
138133 itemBuilder: (context, index) => widgetList[index],
139134 itemCount: widgetList.length,
140135 );
@@ -176,26 +171,20 @@ class _JobListRetrieverState extends State<JobListRetriever>
176171 }
177172
178173 void _onShowToTop () {
179- if (_scrollController.offset >= 100 && ! _showButton ) {
174+ if (_scrollController.offset >= 100 && ! _showScrollTop ) {
180175 setState (() {
181- _showButton = true ;
176+ _showScrollTop = true ;
182177 });
183- } else if (_scrollController.offset < 100 && _showButton ) {
178+ } else if (_scrollController.offset < 100 && _showScrollTop ) {
184179 setState (() {
185- _showButton = false ;
180+ _showScrollTop = false ;
186181 });
187182 }
188183 }
189184
190185 void _onData (List <Job > jobs) {
191186 _jobs.addAll (jobs);
192187
193- if (widget.sortJobs) {
194- _jobs.sort (
195- (a, b) => postedDate (b.posted).compareTo (postedDate (a.posted)),
196- );
197- }
198-
199188 setState (() {
200189 _page++ ;
201190 _loading = false ;
@@ -239,3 +228,34 @@ class _JobListRetrieverState extends State<JobListRetriever>
239228 );
240229 }
241230}
231+
232+ class _ScrollToTop extends StatefulWidget {
233+ const _ScrollToTop ({
234+ required this .onPressed,
235+ required this .showScrollTop,
236+ });
237+
238+ final void Function () onPressed;
239+ final bool showScrollTop;
240+
241+ @override
242+ State <_ScrollToTop > createState () => __ScrollToTopState ();
243+ }
244+
245+ class __ScrollToTopState extends State <_ScrollToTop > {
246+ @override
247+ Widget build (BuildContext context) {
248+ return AnimatedOpacity (
249+ opacity: widget.showScrollTop ? 1.0 : 0.0 ,
250+ duration: const Duration (milliseconds: 800 ),
251+ curve: Curves .elasticIn,
252+ child: Visibility (
253+ visible: widget.showScrollTop,
254+ child: FloatingActionButton (
255+ onPressed: widget.onPressed,
256+ child: const Icon (Icons .arrow_upward),
257+ ),
258+ ),
259+ );
260+ }
261+ }
0 commit comments