From d8e8df4bf8395be29b312204a00038e4eeaac835 Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Mon, 24 Dec 2018 16:05:27 +0530 Subject: [PATCH 01/11] Fixes left-alignment of title text --- lib/hn-state.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/hn-state.dart b/lib/hn-state.dart index 0be7046..cca4533 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -25,12 +25,15 @@ class Title extends StatelessWidget { @override Widget build(BuildContext context) { - return Text( - text, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w500, - color: urlOpened ? Colors.grey : Colors.black, + return Align( + alignment: Alignment.centerLeft, + child: Text( + text, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w500, + color: urlOpened ? Colors.grey : Colors.black, + ) ) ); } From 02afa7f0fc09c1149b8b462760efd1dbca3c33c1 Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Mon, 24 Dec 2018 16:06:01 +0530 Subject: [PATCH 02/11] Removes Scaffold from HackerNewsState class --- lib/hn-state.dart | 187 ++++++++++++++++++++++------------------------ 1 file changed, 91 insertions(+), 96 deletions(-) diff --git a/lib/hn-state.dart b/lib/hn-state.dart index cca4533..273202b 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -119,108 +119,103 @@ class HackerNewsState extends State { @override Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("HackerNews top posts"), - ), - body: ListView.builder( - itemCount: data == null ? 0 : data.length, - itemBuilder: (BuildContext context, int index) { - var urlChecked = openedLinks.contains(data[index]["url"]); - if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { - _incrementPageNum(); - _getJSONData(); - loadedIndices.add(index); - } - return GestureDetector( - onTap: () { - if (data[index]["url"].startsWith("item?")) { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HNWebView( - url: "https://news.ycombinator.com/" + data[index]["url"], - title: data[index]["title"] - ) + return ListView.builder( + itemCount: data == null ? 0 : data.length, + itemBuilder: (BuildContext context, int index) { + var urlChecked = openedLinks.contains(data[index]["url"]); + if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { + _incrementPageNum(); + _getJSONData(); + loadedIndices.add(index); + } + return GestureDetector( + onTap: () { + if (data[index]["url"].startsWith("item?")) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HNWebView( + url: "https://news.ycombinator.com/" + data[index]["url"], + title: data[index]["title"] ) - ); - } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HNWebView( - url: data[index]["url"], - title: data[index]["title"] - ) + ) + ); + } else { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HNWebView( + url: data[index]["url"], + title: data[index]["title"] ) - ); - } - _updateOpenedLinks(data[index]["url"], "onTap"); - }, - onLongPress: () { - var flag = openedLinks.contains(data[index]["url"]) ? "not read" : "read"; - final snackBar = SnackBar(content: Text("Marking as " + flag.toString() + ": " + data[index]["title"]), duration: Duration(milliseconds: 500)); - Scaffold.of(context).showSnackBar(snackBar); - Future.delayed(const Duration(milliseconds: 850), () { - _updateOpenedLinks(data[index]["url"], "onLongPress"); - }); - }, + ) + ); + } + _updateOpenedLinks(data[index]["url"], "onTap"); + }, + onLongPress: () { + var flag = openedLinks.contains(data[index]["url"]) ? "not read" : "read"; + final snackBar = SnackBar(content: Text("Marking as " + flag.toString() + ": " + data[index]["title"]), duration: Duration(milliseconds: 500)); + Scaffold.of(context).showSnackBar(snackBar); + Future.delayed(const Duration(milliseconds: 850), () { + _updateOpenedLinks(data[index]["url"], "onLongPress"); + }); + }, + child: Container( + child: Card( child: Container( - child: Card( - child: Container( - child: Column( - children: [ - Title( - text: data[index]["title"], - urlOpened: urlChecked, - ), - Container( - margin: EdgeInsets.only(top: 10.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - TimeAgo(text: data[index]["time_ago"]), - GestureDetector( - onTap: () { - String __url = data[index]["url"].startsWith("item?") ? "https://news.ycombinator.com/" + data[index]["url"] : data[index]["url"]; - AdvancedShare.whatsapp( - msg: data[index]["title"] + " - " + __url - ).then((_) => { - - }); - }, - child: Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("Share", style: TextStyle(color: Colors.grey, fontSize: 16.0)), - Container( - child: Icon(Icons.share, color: Colors.grey, size: 22.0,), - margin: EdgeInsets.only(left: 5.0), - ) - ] - ), - ), + child: Column( + children: [ + Title( + text: data[index]["title"], + urlOpened: urlChecked, + ), + Container( + margin: EdgeInsets.only(top: 10.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TimeAgo(text: data[index]["time_ago"]), + GestureDetector( + onTap: () { + String __url = data[index]["url"].startsWith("item?") ? "https://news.ycombinator.com/" + data[index]["url"] : data[index]["url"]; + AdvancedShare.whatsapp( + msg: data[index]["title"] + " - " + __url + ).then((_) => { + + }); + }, + child: Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text("Share", style: TextStyle(color: Colors.grey, fontSize: 16.0)), + Container( + child: Icon(Icons.share, color: Colors.grey, size: 22.0,), + margin: EdgeInsets.only(left: 5.0), + ) + ] ), - ], + ), ), - ) - ] - ), - padding: EdgeInsets.all(16.0), - ), - elevation: 2.0, - margin: EdgeInsets.only( - top: 16.0, - bottom: index == data.length - 1 ? 16.0 : 0.0, - left: 10.0, - right: 10.0, - ), + ], + ), + ) + ] ), - ) - ); - } - ) + padding: EdgeInsets.all(16.0), + ), + elevation: 2.0, + margin: EdgeInsets.only( + top: 16.0, + bottom: index == data.length - 1 ? 16.0 : 0.0, + left: 10.0, + right: 10.0, + ), + ), + ) + ); + } ); } } \ No newline at end of file From 7ed1e36cefddb0c20e72ce1989236e138779124b Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Mon, 24 Dec 2018 16:06:23 +0530 Subject: [PATCH 03/11] Adds navigation tabs - News, Newest, Ask, and Show --- lib/main.dart | 49 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2d27674..985b523 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -10,12 +10,53 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( title: 'HackerNews', - home: HackerNews( - url: "https://api.hnpwa.com/v0/news/", - currentPage: 1 + home: DefaultTabController( + length: 4, + child: Scaffold( + appBar: AppBar( + title: Text("NewsHacker"), + bottom: TabBar( + tabs: [ + Tab(text: "News"), + Tab(text: "Newest"), + Tab(text: "Ask"), + Tab(text: "Show"), + ], + indicatorColor: Colors.white, + isScrollable: true, + labelStyle: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w600, + color: Colors.white, + ), + unselectedLabelStyle: TextStyle( + color: Colors.white12, + fontWeight: FontWeight.w400, + ), + ), + ), + body: TabBarView(children: [ + HackerNews( + url: "https://api.hnpwa.com/v0/news/", + currentPage: 1 + ), + HackerNews( + url: "https://api.hnpwa.com/v0/newest/", + currentPage: 1 + ), + HackerNews( + url: "https://api.hnpwa.com/v0/ask/", + currentPage: 1 + ), + HackerNews( + url: "https://api.hnpwa.com/v0/show/", + currentPage: 1 + ), + ]), + ) ), theme: ThemeData( - primaryColor: Colors.deepOrange, + primaryColor: Colors.deepOrangeAccent, ) ); } From bb78203710590770f8a40c2ed6a5d4552d811cff Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 20:40:58 +0530 Subject: [PATCH 04/11] Adds hn-components.dart Contains Title, TimeAge, and Domain components --- lib/hn-components.dart | 65 ++++++++++++++++++++++++++++++++++++++++++ lib/hn-state.dart | 40 +------------------------- 2 files changed, 66 insertions(+), 39 deletions(-) create mode 100644 lib/hn-components.dart diff --git a/lib/hn-components.dart b/lib/hn-components.dart new file mode 100644 index 0000000..6ce4ae7 --- /dev/null +++ b/lib/hn-components.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +class TimeAgo extends StatelessWidget { + final String text; + + TimeAgo({Key key, @required this.text}): super(key: key); + + @override + Widget build(BuildContext context) { + return Text( + text, + style: TextStyle( + color: Colors.grey, + fontSize: 14.0, + ) + ); + } +} + +class FeedCardTitle extends StatelessWidget { + final String text; + final bool urlOpened; + + FeedCardTitle ({Key key, @required this.text, @required this.urlOpened}): super(key: key); + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.centerLeft, + child: Text( + text, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w500, + color: urlOpened ? Colors.grey : Colors.black, + decoration: urlOpened ? TextDecoration.lineThrough : null, + ) + ) + ); + } +} + +class Domain extends StatelessWidget { + final String text; + + Domain({Key key, @required this.text}): super(key: key); + + @override + Widget build(BuildContext context) { + return Align( + alignment: Alignment.centerLeft, + child: Text( + text, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w300, + color: Colors.black87, + ) + ) + ); + } +} + + + diff --git a/lib/hn-state.dart b/lib/hn-state.dart index 273202b..d7d3e33 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:advanced_share/advanced_share.dart'; import 'package:hackernews/hn-webview.dart'; +import 'package:hackernews/hn-components.dart'; class HackerNews extends StatefulWidget { final String url; @@ -17,45 +18,6 @@ class HackerNews extends StatefulWidget { HackerNewsState createState() => new HackerNewsState(url: this.url, currentPage: this.currentPage); } -class Title extends StatelessWidget { - final String text; - final bool urlOpened; - - Title({Key key, @required this.text, @required this.urlOpened}): super(key: key); - - @override - Widget build(BuildContext context) { - return Align( - alignment: Alignment.centerLeft, - child: Text( - text, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w500, - color: urlOpened ? Colors.grey : Colors.black, - ) - ) - ); - } -} - -class TimeAgo extends StatelessWidget { - final String text; - - TimeAgo({Key key, @required this.text}): super(key: key); - - @override - Widget build(BuildContext context) { - return Text( - text, - style: TextStyle( - color: Colors.grey, - fontSize: 14.0, - ) - ); - } -} - class HackerNewsState extends State { int currentPage; int lastItemIndex = -1; From 81b41a1ac88cd5715f3891a0690c1c334ef16b8c Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 20:41:29 +0530 Subject: [PATCH 05/11] Adds HN model class --- lib/hn-model.dart | 36 ++++++++++++++++++++++++++++++++++++ lib/hn-state.dart | 39 ++++++++++++++++++++------------------- 2 files changed, 56 insertions(+), 19 deletions(-) create mode 100644 lib/hn-model.dart diff --git a/lib/hn-model.dart b/lib/hn-model.dart new file mode 100644 index 0000000..32dd347 --- /dev/null +++ b/lib/hn-model.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +class FeedCard { + int id; + String title; + int points; + String user; + String timeAgo; + int commentsCount; + String url; + String domain; + + FeedCard({ + this.id, + this.title, + this.points, + this.user, + this.timeAgo, + this.commentsCount, + this.url, + this.domain + }); + + factory FeedCard.fromJSON(Map postJSON) { + return FeedCard( + id: postJSON["id"] as int, + title: postJSON["title"] as String, + points: postJSON["points"] as int, + user: postJSON["user"] as String, + timeAgo: postJSON["time_ago"] as String, + commentsCount: postJSON["comments_count"] as int, + url: postJSON["url"] as String, + domain: postJSON["domain"] as String, + ); + } +} diff --git a/lib/hn-state.dart b/lib/hn-state.dart index d7d3e33..7bb5734 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -7,6 +7,7 @@ import 'package:advanced_share/advanced_share.dart'; import 'package:hackernews/hn-webview.dart'; import 'package:hackernews/hn-components.dart'; +import 'package:hackernews/hn-model.dart'; class HackerNews extends StatefulWidget { final String url; @@ -51,8 +52,8 @@ class HackerNewsState extends State { headers: {"Accept": "application/json"}, ); setState(() { - for (var value in jsonDecode(response.body)) { - data.add(value); + for (var postJSON in jsonDecode(response.body)) { + data.add(FeedCard.fromJSON(postJSON)); } lastItemIndex = data.length - 1; }); @@ -60,7 +61,7 @@ class HackerNewsState extends State { } void _incrementPageNum() { - if (currentPage + 1 == 5) { + if (currentPage + 1 == 10) { return; } currentPage = currentPage + 1; @@ -84,7 +85,7 @@ class HackerNewsState extends State { return ListView.builder( itemCount: data == null ? 0 : data.length, itemBuilder: (BuildContext context, int index) { - var urlChecked = openedLinks.contains(data[index]["url"]); + var urlChecked = openedLinks.contains(data[index].url); if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { _incrementPageNum(); _getJSONData(); @@ -92,13 +93,13 @@ class HackerNewsState extends State { } return GestureDetector( onTap: () { - if (data[index]["url"].startsWith("item?")) { + if (data[index].url.startsWith("item?")) { Navigator.push( context, MaterialPageRoute( builder: (context) => HNWebView( - url: "https://news.ycombinator.com/" + data[index]["url"], - title: data[index]["title"] + url: "https://news.ycombinator.com/" + data[index].url, + title: data[index].title ) ) ); @@ -107,20 +108,20 @@ class HackerNewsState extends State { context, MaterialPageRoute( builder: (context) => HNWebView( - url: data[index]["url"], - title: data[index]["title"] + url: data[index].url, + title: data[index].title ) ) ); } - _updateOpenedLinks(data[index]["url"], "onTap"); + _updateOpenedLinks(data[index].url, "onTap"); }, onLongPress: () { - var flag = openedLinks.contains(data[index]["url"]) ? "not read" : "read"; - final snackBar = SnackBar(content: Text("Marking as " + flag.toString() + ": " + data[index]["title"]), duration: Duration(milliseconds: 500)); + var flag = openedLinks.contains(data[index].url) ? "not read" : "read"; + final snackBar = SnackBar(content: Text("Marking as " + flag.toString() + ": " + data[index].url), duration: Duration(milliseconds: 500)); Scaffold.of(context).showSnackBar(snackBar); Future.delayed(const Duration(milliseconds: 850), () { - _updateOpenedLinks(data[index]["url"], "onLongPress"); + _updateOpenedLinks(data[index].url, "onLongPress"); }); }, child: Container( @@ -128,8 +129,8 @@ class HackerNewsState extends State { child: Container( child: Column( children: [ - Title( - text: data[index]["title"], + FeedCardTitle( + text: data[index].title, urlOpened: urlChecked, ), Container( @@ -137,12 +138,13 @@ class HackerNewsState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - TimeAgo(text: data[index]["time_ago"]), + TimeAgo(text: data[index].timeAgo), + Domain(text: data[index].domain), GestureDetector( onTap: () { - String __url = data[index]["url"].startsWith("item?") ? "https://news.ycombinator.com/" + data[index]["url"] : data[index]["url"]; + String __url = data[index].url.startsWith("item?") ? "https://news.ycombinator.com/" + data[index].url : data[index].url; AdvancedShare.whatsapp( - msg: data[index]["title"] + " - " + __url + msg: data[index].title + " - " + __url ).then((_) => { }); @@ -151,7 +153,6 @@ class HackerNewsState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text("Share", style: TextStyle(color: Colors.grey, fontSize: 16.0)), Container( child: Icon(Icons.share, color: Colors.grey, size: 22.0,), margin: EdgeInsets.only(left: 5.0), From c288810e4555a1775ec4bf99ce6d9e0c45b782fa Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 20:55:25 +0530 Subject: [PATCH 06/11] Adds fallback for Domain text --- lib/hn-components.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/hn-components.dart b/lib/hn-components.dart index 6ce4ae7..0c9503f 100644 --- a/lib/hn-components.dart +++ b/lib/hn-components.dart @@ -43,14 +43,14 @@ class FeedCardTitle extends StatelessWidget { class Domain extends StatelessWidget { final String text; - Domain({Key key, @required this.text}): super(key: key); + Domain({Key key, this.text}): super(key: key); @override Widget build(BuildContext context) { return Align( alignment: Alignment.centerLeft, child: Text( - text, + text ?? "", style: TextStyle( fontSize: 16.0, fontWeight: FontWeight.w300, From a19dc34b9e180c5d4942d62fe9ccdb7180a2ad0a Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 20:55:41 +0530 Subject: [PATCH 07/11] Removes unused import of material.dart in hn-model.dart --- lib/hn-model.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/hn-model.dart b/lib/hn-model.dart index 32dd347..9be2dd0 100644 --- a/lib/hn-model.dart +++ b/lib/hn-model.dart @@ -1,5 +1,3 @@ -import 'package:flutter/material.dart'; - class FeedCard { int id; String title; From fac5f8ad9bce6041aba217ef2b8e3848dd3cb916 Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 20:56:29 +0530 Subject: [PATCH 08/11] Adds maxPages for each of the HN tabs --- lib/hn-state.dart | 41 +++++++++++++++++++++++++++++++---------- lib/main.dart | 12 ++++++++---- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/lib/hn-state.dart b/lib/hn-state.dart index 7bb5734..1b690f5 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -12,22 +12,38 @@ import 'package:hackernews/hn-model.dart'; class HackerNews extends StatefulWidget { final String url; final int currentPage; + final int maxPages; - HackerNews({Key key, @required this.url, @required this.currentPage}): super(key: key); + HackerNews({ + Key key, + @required this.url, + @required this.currentPage, + @required this.maxPages + }): super(key: key); @override - HackerNewsState createState() => new HackerNewsState(url: this.url, currentPage: this.currentPage); + HackerNewsState createState() => new HackerNewsState( + url: this.url, + currentPage: this.currentPage, + maxPages: this.maxPages + ); } class HackerNewsState extends State { int currentPage; + int maxPages; int lastItemIndex = -1; List data = []; List loadedIndices = []; List openedLinks = []; String url; - HackerNewsState({Key key, @required this.url, @required this.currentPage}); + HackerNewsState({ + Key key, + @required this.url, + @required this.currentPage, + @required this.maxPages + }); @override void initState() { @@ -57,14 +73,17 @@ class HackerNewsState extends State { } lastItemIndex = data.length - 1; }); + print("currentPage: " + currentPage.toString() + "/" + maxPages.toString()); return "Successful"; } - void _incrementPageNum() { - if (currentPage + 1 == 10) { - return; + bool _incrementPageNum() { + if (currentPage + 1 > maxPages) { + return false; } currentPage = currentPage + 1; + print("currentPage: " + currentPage.toString() + "/" + maxPages.toString()); + return true; } void _updateOpenedLinks(String url, String source) async { @@ -86,10 +105,12 @@ class HackerNewsState extends State { itemCount: data == null ? 0 : data.length, itemBuilder: (BuildContext context, int index) { var urlChecked = openedLinks.contains(data[index].url); - if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { - _incrementPageNum(); - _getJSONData(); - loadedIndices.add(index); + if (currentPage < maxPages) { + if (index > 0 && index % 29 == 0 && loadedIndices.contains(index) == false) { + _incrementPageNum(); + _getJSONData(); + loadedIndices.add(index); + } } return GestureDetector( onTap: () { diff --git a/lib/main.dart b/lib/main.dart index 985b523..836d494 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,19 +38,23 @@ class MyApp extends StatelessWidget { body: TabBarView(children: [ HackerNews( url: "https://api.hnpwa.com/v0/news/", - currentPage: 1 + currentPage: 1, + maxPages: 10, ), HackerNews( url: "https://api.hnpwa.com/v0/newest/", - currentPage: 1 + currentPage: 1, + maxPages: 12, ), HackerNews( url: "https://api.hnpwa.com/v0/ask/", - currentPage: 1 + currentPage: 1, + maxPages: 2, ), HackerNews( url: "https://api.hnpwa.com/v0/show/", - currentPage: 1 + currentPage: 1, + maxPages: 2, ), ]), ) From 0b58916e8f014ca522f9a33a3fcae8e656c3ff9a Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 22:10:35 +0530 Subject: [PATCH 09/11] Fixes indentation of webview navigation --- lib/hn-state.dart | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/hn-state.dart b/lib/hn-state.dart index 1b690f5..36f0323 100644 --- a/lib/hn-state.dart +++ b/lib/hn-state.dart @@ -116,23 +116,23 @@ class HackerNewsState extends State { onTap: () { if (data[index].url.startsWith("item?")) { Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HNWebView( - url: "https://news.ycombinator.com/" + data[index].url, - title: data[index].title - ) + context, + MaterialPageRoute( + builder: (context) => HNWebView( + url: "https://news.ycombinator.com/" + data[index].url, + title: data[index].title ) + ) ); } else { Navigator.push( - context, - MaterialPageRoute( - builder: (context) => HNWebView( - url: data[index].url, - title: data[index].title - ) + context, + MaterialPageRoute( + builder: (context) => HNWebView( + url: data[index].url, + title: data[index].title ) + ) ); } _updateOpenedLinks(data[index].url, "onTap"); From 1edda7486587401b7d5c786eeb8f342a0c209c7a Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 22:10:45 +0530 Subject: [PATCH 10/11] Fixes AppBar title --- lib/main.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/main.dart b/lib/main.dart index 836d494..ed1b4a0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,7 @@ class MyApp extends StatelessWidget { length: 4, child: Scaffold( appBar: AppBar( - title: Text("NewsHacker"), + title: Text("HackerNews"), bottom: TabBar( tabs: [ Tab(text: "News"), From d09ab94f95549f76037a838898a728b809a5282f Mon Sep 17 00:00:00 2001 From: Santosh Venkatraman Date: Tue, 25 Dec 2018 22:11:08 +0530 Subject: [PATCH 11/11] Uses RichText instead of Text --- lib/hn-components.dart | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/hn-components.dart b/lib/hn-components.dart index 0c9503f..6737fa4 100644 --- a/lib/hn-components.dart +++ b/lib/hn-components.dart @@ -7,12 +7,14 @@ class TimeAgo extends StatelessWidget { @override Widget build(BuildContext context) { - return Text( - text, + return RichText( + text: TextSpan( + text: text, style: TextStyle( color: Colors.grey, fontSize: 14.0, ) + ) ); } } @@ -26,16 +28,18 @@ class FeedCardTitle extends StatelessWidget { @override Widget build(BuildContext context) { return Align( - alignment: Alignment.centerLeft, - child: Text( - text, - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.w500, - color: urlOpened ? Colors.grey : Colors.black, - decoration: urlOpened ? TextDecoration.lineThrough : null, - ) + alignment: Alignment.centerLeft, + child: RichText( + text: TextSpan( + text: text, + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.w500, + color: urlOpened ? Colors.grey : Colors.black, + decoration: urlOpened ? TextDecoration.lineThrough : null, + ) ) + ) ); } }