From c269f3e25f4ab1bd29e63c5eee0f8b1469a6b404 Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Thu, 31 Jan 2019 09:46:29 +0530 Subject: [PATCH] Replaces infinite scrolling & fetching of feeds with a button Reason - better UX --- lib/hn-state.dart | 142 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 110 insertions(+), 32 deletions(-) diff --git a/lib/hn-state.dart b/lib/hn-state.dart index 7f04f35..2473213 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -131,45 +131,108 @@ class HackerNewsState extends State { @override Widget build(BuildContext context) { - if (this.loading) { - return Loader(text: "Fetching stories..."); + if (this.loading && data.length == 0) { + return Stack( + children: [ + Loader(text: "Fetching stories...") + ], + ); } - return ListView.builder( - itemCount: data == null ? 0 : data.length, - itemBuilder: (BuildContext context, int index) { - var urlChecked = openedLinks.contains(data[index].url); + var listView = ListView.builder( + itemCount: data == null ? 0 : data.length + 1, + itemBuilder: (BuildContext context, int index) { + if (index >= data.length) { if (currentPage < maxPages) { - if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { - _incrementPageNum(); - _getJSONData(); - loadedIndices.add(index); - } + return GestureDetector( + onTap: () async { + _incrementPageNum(); + _getJSONData(); + }, + child: Container( + child: Card( + color: Colors.deepOrangeAccent, + child: Container( + child: Align( + alignment: Alignment.center, + child: Text( + this.loading ? "Loading more stories" : "Load more stories", + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w300, + color: Colors.white, + ) + ) + ), + padding: EdgeInsets.all(16.0) + ), + elevation: 2.0, + margin: EdgeInsets.only( + top: 16.0, + bottom: 16.0, + left: 10.0, + right: 10.0, + ) + ), + ), + ); } return GestureDetector( + onTap: () async { + Scaffold.of(context).showSnackBar(SnackBar(content: Text("You have reached the end of the feed"))); + }, + child: Container( + child: Card( + color: Colors.deepOrangeAccent, + child: Container( + child: Align( + alignment: Alignment.center, + child: Text( + "Load more stories", + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w300, + color: Colors.white, + ) + ) + ), + padding: EdgeInsets.all(16.0) + ), + elevation: 2.0, + margin: EdgeInsets.only( + bottom: 16.0, + left: 10.0, + right: 10.0, + ) + ), + ), + ); + } + var urlChecked = openedLinks.contains(data[index].url); + return GestureDetector( onTap: () async { String __url = data[index].url.startsWith("item?") ? "https://news.ycombinator.com/" + data[index].url : data[index].url; DateTime start = DateTime.now(); final result = await Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HNWebView( - url: __url, - title: data[index].title, - analytics: this.analytics, - observer: this.observer, + context, + MaterialPageRoute( + builder: (context) => HNWebView( + url: __url, + title: data[index].title, + analytics: this.analytics, + observer: this.observer, + ) ) - ) ); this._sendAnalyticsEvent( - "story_read", - { - "url": __url, - "title": data[index].title, - "time_spent": DateTime.now().difference(start).inSeconds, - } + "story_read", + { + "url": __url, + "title": data[index].title, + "time_spent": DateTime.now().difference(start).inSeconds, + } ); _updateOpenedLinks(data[index].url, "onTap"); @@ -178,12 +241,12 @@ class HackerNewsState extends State { var flag = openedLinks.contains(data[index].url) ? "not read" : "read"; String __url = data[index].url.startsWith("item?") ? "https://news.ycombinator.com/" + data[index].url : data[index].url; this._sendAnalyticsEvent( - "story_bookmarked", - { - "url": __url, - "title": data[index].title, - "bookmarked": !openedLinks.contains(data[index].url) - } + "story_bookmarked", + { + "url": __url, + "title": data[index].title, + "bookmarked": !openedLinks.contains(data[index].url) + } ); final snackBar = SnackBar(content: Text("Marking as " + flag.toString() + ": " + data[index].url), duration: Duration(milliseconds: 500)); Scaffold.of(context).showSnackBar(snackBar); @@ -218,7 +281,7 @@ class HackerNewsState extends State { elevation: 2.0, margin: EdgeInsets.only( top: 16.0, - bottom: index == data.length - 1 ? 16.0 : 0.0, + bottom: index == data.length - 1 && currentPage >= maxPages ? 16.0 : 0.0, left: 10.0, right: 10.0, ), @@ -227,5 +290,20 @@ class HackerNewsState extends State { ); } ); + + if (this.loading) { + return Stack( + children: [ + listView, + Loader(text: "Fetching stories...") + ], + ); + } + + return Stack( + children: [ + listView, + ], + ); } } \ No newline at end of file