From 5cdf2549dfadf67e9a4aa1e46027675473661a99 Mon Sep 17 00:00:00 2001 From: kwainright Date: Thu, 2 Apr 2020 14:01:54 -0400 Subject: [PATCH 01/12] Twitter - nothing implemented - setting up testing routes --- lib/route_generator.dart | 3 +++ lib/screens/home_widget.dart | 6 +++++ lib/screens/twitter_widget.dart | 40 +++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 lib/screens/twitter_widget.dart diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 3e01d5e..55004a4 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -4,6 +4,7 @@ import 'package:capstone_hungry_hippos/screens/standing.dart'; import 'package:flutter/material.dart'; import 'package:capstone_hungry_hippos/screens/home_widget.dart'; import 'package:capstone_hungry_hippos/screens/sport.dart'; +import 'package:capstone_hungry_hippos/screens/twitter_widget.dart'; class RouteGenerator { static Route generateRoute(RouteSettings settings){ @@ -21,6 +22,8 @@ class RouteGenerator { return MaterialPageRoute(builder: (_) => Standing()); case '/Chat': return MaterialPageRoute(builder: (_) => Chat()); + case '/Twitter': + return MaterialPageRoute(builder: (_) => TwitterFeed()); default: return _errorRoute(); } diff --git a/lib/screens/home_widget.dart b/lib/screens/home_widget.dart index 6c0488d..fe40107 100644 --- a/lib/screens/home_widget.dart +++ b/lib/screens/home_widget.dart @@ -32,6 +32,12 @@ class Home extends StatelessWidget { onPressed: () => Navigator.pushNamed(context, '/Chat'), ), ), + ListTile( + title: IconButton( + icon: Icon(Icons.), + onPressed: () => Navigator.pushNamed(context, '/Twitter'), + ), + ), ], ), ), diff --git a/lib/screens/twitter_widget.dart b/lib/screens/twitter_widget.dart new file mode 100644 index 0000000..6fd8fa4 --- /dev/null +++ b/lib/screens/twitter_widget.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +class TwitterFeed extends StatelessWidget{ + @override + Widget build(BuildContext context) { + return StatefulBuilder( + builder: (context, StateSetter setState) => Scaffold( + appBar: AppBar( + centerTitle: false, + title: Text("49ers"), + backgroundColor: Colors.green, + ), + body: Text("Twitter Goes here"), + drawer: Drawer( + child: ListView( + children: [ + DrawerHeader( + child: Text( + 'Drawer Header', + style: TextStyle( + color: Colors.white, + fontSize: 24, + ), + ), + decoration: BoxDecoration( + color: Colors.green, + ), + ), + ListTile( + title: IconButton( + icon: Icon(Icons.home), + onPressed: () => Navigator.pushNamed(context, '/'), + ), + ), + ], + ), + ) + )); + } +} \ No newline at end of file From b8b0a790f66e89014e81c6807b7b43f9e7773dbf Mon Sep 17 00:00:00 2001 From: kwainright Date: Tue, 7 Apr 2020 16:48:18 -0400 Subject: [PATCH 02/12] Twitter - Layout implemented - need to get API data --- lib/screens/home_widget.dart | 2 +- lib/screens/twitter_widget.dart | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/lib/screens/home_widget.dart b/lib/screens/home_widget.dart index fe40107..cf8f09c 100644 --- a/lib/screens/home_widget.dart +++ b/lib/screens/home_widget.dart @@ -34,7 +34,7 @@ class Home extends StatelessWidget { ), ListTile( title: IconButton( - icon: Icon(Icons.), + icon: Icon(Icons.voice_chat), onPressed: () => Navigator.pushNamed(context, '/Twitter'), ), ), diff --git a/lib/screens/twitter_widget.dart b/lib/screens/twitter_widget.dart index 6fd8fa4..18807da 100644 --- a/lib/screens/twitter_widget.dart +++ b/lib/screens/twitter_widget.dart @@ -10,7 +10,21 @@ class TwitterFeed extends StatelessWidget{ title: Text("49ers"), backgroundColor: Colors.green, ), - body: Text("Twitter Goes here"), + body: Container( + color: Colors.black12, + child: ListView.builder( + itemCount: 10, + itemBuilder: (context, ind){ + return Card( + child: ListTile( + leading: FlutterLogo(), + title: Text('Twitter User'), + subtitle: Text('Tweet: I really hope I can figure out the whole URl thing what if this is longer and stuff. will it wrap around? I hope so we about to find out'), + ), + ); + } + ), + ), drawer: Drawer( child: ListView( children: [ @@ -37,4 +51,5 @@ class TwitterFeed extends StatelessWidget{ ) )); } -} \ No newline at end of file +} + From a2e2cb693d10a79d766681188e0a46c8bd9e09cc Mon Sep 17 00:00:00 2001 From: kwainright Date: Wed, 8 Apr 2020 19:17:24 -0400 Subject: [PATCH 03/12] Twitter - Api half way there - have to figure out the Twitter Authorization with Dart. --- lib/screens/twitter_widget.dart | 17 +++----- lib/twitter_assets/tweet.dart | 53 +++++++++++++++++++++++++ lib/twitter_assets/twitterFeed.dart | 60 +++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 lib/twitter_assets/tweet.dart create mode 100644 lib/twitter_assets/twitterFeed.dart diff --git a/lib/screens/twitter_widget.dart b/lib/screens/twitter_widget.dart index 18807da..2a4a3b1 100644 --- a/lib/screens/twitter_widget.dart +++ b/lib/screens/twitter_widget.dart @@ -1,6 +1,10 @@ +import 'package:capstone_hungry_hippos/twitter_assets/twitterFeed.dart'; import 'package:flutter/material.dart'; +import '../twitter_assets/tweet.dart'; class TwitterFeed extends StatelessWidget{ + final feed = TwitterFeedCreation(); + @override Widget build(BuildContext context) { return StatefulBuilder( @@ -12,18 +16,7 @@ class TwitterFeed extends StatelessWidget{ ), body: Container( color: Colors.black12, - child: ListView.builder( - itemCount: 10, - itemBuilder: (context, ind){ - return Card( - child: ListTile( - leading: FlutterLogo(), - title: Text('Twitter User'), - subtitle: Text('Tweet: I really hope I can figure out the whole URl thing what if this is longer and stuff. will it wrap around? I hope so we about to find out'), - ), - ); - } - ), + child: VerticalTwitterFeed(twitterFeed: feed), ), drawer: Drawer( child: ListView( diff --git a/lib/twitter_assets/tweet.dart b/lib/twitter_assets/tweet.dart new file mode 100644 index 0000000..5c75f53 --- /dev/null +++ b/lib/twitter_assets/tweet.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +class Tweet { + final int id; + final String text; + final String userName; + final String userImgUrl; + final String url; + + Tweet( + this.id, { + this.text, + this.userName, + this.userImgUrl, + this.url, + }); + + factory Tweet.fromJson(Map json) { + return Tweet( + json['id_str'], + text: json['text'], + userName: json['user']['name'], + userImgUrl: json['user']['profile_image_url_https'], + url: json['urls']['expanded_url'], + ); + } +} + +class TwitterCard extends StatelessWidget{ + + const TwitterCard({ + Key key, + @required this.tweet, + }) : super(key: key); + + final Tweet tweet; + + @override + Widget build(BuildContext context) { + return Card( + child: ListTile( + leading: SizedBox( + width: 75, + height: 75, + child: Image.network('${tweet.userImgUrl}'), + ), + title: Text('${tweet.userName}'), + subtitle: Text('${tweet.text}'), + ), + ); + } +} + diff --git a/lib/twitter_assets/twitterFeed.dart b/lib/twitter_assets/twitterFeed.dart new file mode 100644 index 0000000..e0cab00 --- /dev/null +++ b/lib/twitter_assets/twitterFeed.dart @@ -0,0 +1,60 @@ +import 'dart:io'; + +import 'package:capstone_hungry_hippos/screens/twitter_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; + +import 'dart:convert'; + +import 'tweet.dart'; + +class TwitterFeedCreation { + static final twitterBase = 'https://api.twitter.com/1.1/search'; + + static final apiKey = 'AFBfOqx8uXIUBZMxAFoQyO3zA'; + static final apiSecret = '48Gp7nczz9SqExorwYuWpA6Nmviuox6Beq83kjH1XtYtunorym'; + + Future> getPage({int size = 10}) async { + var url = '$twitterBase/tweets.json?q=from%3ACharlotteFTBL&result_type=mixed&count=$size'; + http.Response response = await http.get(url + ); + Iterable tweets = json.decode(response.body); + return tweets.map((e) => Tweet.fromJson(e)).toList(); + } +} + + +class VerticalTwitterFeed extends StatelessWidget{ + + final TwitterFeedCreation twitterFeed; + + const VerticalTwitterFeed({ + Key key, + @required this.twitterFeed, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + child: FutureBuilder( + future: twitterFeed.getPage(), + builder: (ctx, snapshot){ + if(!snapshot.hasData){ + return Center(child: CircularProgressIndicator()); + }else{ + List tweets = snapshot.data; + return ListView.builder( + scrollDirection: Axis.vertical, + itemCount: tweets.length, + itemBuilder: (ctx, idx) { + return TwitterCard( + tweet: tweets[idx], + ); + }, + ); + } + }, + ), + ); + } +} \ No newline at end of file From b929018c9b2da6737f2574404953b6fd34dbcdee Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 14:40:15 -0400 Subject: [PATCH 04/12] upgrade packages --- pubspec.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index a5d537b..eeaa3b1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -101,7 +101,7 @@ packages: name: http_parser url: "https://pub.dartlang.org" source: hosted - version: "3.1.3" + version: "3.1.4" image: dependency: transitive description: @@ -218,7 +218,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.15" + version: "0.2.11" typed_data: dependency: transitive description: From 9fc50a5215416c05bc5f7f5a419d2b541225ed0e Mon Sep 17 00:00:00 2001 From: kwainright Date: Thu, 9 Apr 2020 17:50:51 -0400 Subject: [PATCH 05/12] Twitter - Api half way there - committing to check out other branch --- lib/twitter_assets/twitterFeed.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/twitter_assets/twitterFeed.dart b/lib/twitter_assets/twitterFeed.dart index e0cab00..9199593 100644 --- a/lib/twitter_assets/twitterFeed.dart +++ b/lib/twitter_assets/twitterFeed.dart @@ -14,9 +14,14 @@ class TwitterFeedCreation { static final apiKey = 'AFBfOqx8uXIUBZMxAFoQyO3zA'; static final apiSecret = '48Gp7nczz9SqExorwYuWpA6Nmviuox6Beq83kjH1XtYtunorym'; + getToken() async { + http.Response response = await http.get('https://api.twitter.com/oauth2/token',); +} + Future> getPage({int size = 10}) async { var url = '$twitterBase/tweets.json?q=from%3ACharlotteFTBL&result_type=mixed&count=$size'; - http.Response response = await http.get(url + http.Response response = await http.get(url, + headers: {} ); Iterable tweets = json.decode(response.body); return tweets.map((e) => Tweet.fromJson(e)).toList(); From 2d103cba78e0a185445af32557338ebfbee32fe0 Mon Sep 17 00:00:00 2001 From: kwainright Date: Thu, 9 Apr 2020 18:32:06 -0400 Subject: [PATCH 06/12] Twitter - Api half way there - committing to check out other branch --- lib/twitter_assets/twitterFeed.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twitter_assets/twitterFeed.dart b/lib/twitter_assets/twitterFeed.dart index 9199593..90fc5cd 100644 --- a/lib/twitter_assets/twitterFeed.dart +++ b/lib/twitter_assets/twitterFeed.dart @@ -21,7 +21,7 @@ class TwitterFeedCreation { Future> getPage({int size = 10}) async { var url = '$twitterBase/tweets.json?q=from%3ACharlotteFTBL&result_type=mixed&count=$size'; http.Response response = await http.get(url, - headers: {} + headers: {'authorization': apiKey,} ); Iterable tweets = json.decode(response.body); return tweets.map((e) => Tweet.fromJson(e)).toList(); From 0510b9f7dddb69ae52a6d0a615ee0cf1e1423e7d Mon Sep 17 00:00:00 2001 From: kwainright Date: Thu, 9 Apr 2020 20:38:48 -0400 Subject: [PATCH 07/12] Twitter - proof of concept - needs api fleshed out. has place holder data --- lib/screens/twitter_widget.dart | 23 +++++++++++++++--- lib/twitter_assets/tweet.dart | 36 +++++++++++++++++++++-------- lib/twitter_assets/twitterFeed.dart | 21 +++++++++++++---- 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/lib/screens/twitter_widget.dart b/lib/screens/twitter_widget.dart index 2a4a3b1..593cb73 100644 --- a/lib/screens/twitter_widget.dart +++ b/lib/screens/twitter_widget.dart @@ -3,20 +3,37 @@ import 'package:flutter/material.dart'; import '../twitter_assets/tweet.dart'; class TwitterFeed extends StatelessWidget{ - final feed = TwitterFeedCreation(); + List fuck = []; + final test = new Tweet(1, "We'll get through this together, Niner Nation. #WeAreAllNiners", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test2 = new Tweet(2, "Let's test your UNC Charlotte knowledge...do you know why we became the 49ers? Here's the full history on the pioneering spirit that shaped our trajectory http://bit.ly/UNCC-1949", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test3 = new Tweet(3, "Niner Nation means uplifting each other. This 4/9 Day, let's show our students why #WeAreAllNiners by supporting the Student Emergency Relief Fund ️ http://bit.ly/UNCC-SER", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test4 = new Tweet(4, "Niner Nation: Chancellor Dubois shares that UNC Charlotte will be able to apply our established parking refund procedures with special considerations for the impact of COVID-19.", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test5 = new Tweet(5, "4/9 Day is just for us, Niner Nation. From wherever you are, you're family #WeAreAllNiners", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test6= new Tweet(6, "Niner Nation, #49erAlumni Gene Johnson ’73 is getting us excited for 4/9 Day tomorrow! Put on your Niner gear, call your friends and let’s celebrate together virtually \n We’re all in this together! ", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + final test7 = new Tweet(7, "From virtual events to one-on-one sessions with counselors, it's easy to stay connected with @UNCCAdmissions", "@unccharlotte", "https://pbs.twimg.com/profile_images/1175214096280629249/QC79Xju2_400x400.jpg", "test"); + @override Widget build(BuildContext context) { + fuck.add(test); + fuck.add(test2); + fuck.add(test3); + fuck.add(test4); + fuck.add(test5); + fuck.add(test6); + fuck.add(test7); + return StatefulBuilder( builder: (context, StateSetter setState) => Scaffold( appBar: AppBar( centerTitle: false, - title: Text("49ers"), + title: Text("49ers Tweets"), backgroundColor: Colors.green, ), body: Container( color: Colors.black12, - child: VerticalTwitterFeed(twitterFeed: feed), + child: + VerticalTwitterFeed(twitterFeed: fuck), ), drawer: Drawer( child: ListView( diff --git a/lib/twitter_assets/tweet.dart b/lib/twitter_assets/tweet.dart index 5c75f53..47aac31 100644 --- a/lib/twitter_assets/tweet.dart +++ b/lib/twitter_assets/tweet.dart @@ -8,14 +8,14 @@ class Tweet { final String url; Tweet( - this.id, { + this.id, this.text, this.userName, this.userImgUrl, this.url, - }); + ); - factory Tweet.fromJson(Map json) { + /*factory Tweet.fromJson(Map json) { return Tweet( json['id_str'], text: json['text'], @@ -24,6 +24,11 @@ class Tweet { url: json['urls']['expanded_url'], ); } + Commenting out till we figure out the API + */ + + + } class TwitterCard extends StatelessWidget{ @@ -38,14 +43,25 @@ class TwitterCard extends StatelessWidget{ @override Widget build(BuildContext context) { return Card( - child: ListTile( - leading: SizedBox( - width: 75, - height: 75, - child: Image.network('${tweet.userImgUrl}'), + child: Padding( + padding: EdgeInsets.symmetric(vertical: 10, horizontal: 0), + child: ListTile( + leading: SizedBox( + height: 125, + width: 75, + child: Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.fill, + image: NetworkImage('${tweet.userImgUrl}'), + ), + ), + ), + ), + title: Text('${tweet.userName}'), + subtitle: Text('${tweet.text}'), ), - title: Text('${tweet.userName}'), - subtitle: Text('${tweet.text}'), ), ); } diff --git a/lib/twitter_assets/twitterFeed.dart b/lib/twitter_assets/twitterFeed.dart index 90fc5cd..4fdc735 100644 --- a/lib/twitter_assets/twitterFeed.dart +++ b/lib/twitter_assets/twitterFeed.dart @@ -18,20 +18,20 @@ class TwitterFeedCreation { http.Response response = await http.get('https://api.twitter.com/oauth2/token',); } - Future> getPage({int size = 10}) async { + /*Future> getPage({int size = 10}) async { var url = '$twitterBase/tweets.json?q=from%3ACharlotteFTBL&result_type=mixed&count=$size'; http.Response response = await http.get(url, headers: {'authorization': apiKey,} ); Iterable tweets = json.decode(response.body); return tweets.map((e) => Tweet.fromJson(e)).toList(); - } + } */ } class VerticalTwitterFeed extends StatelessWidget{ - final TwitterFeedCreation twitterFeed; + final List twitterFeed; const VerticalTwitterFeed({ Key key, @@ -40,7 +40,20 @@ class VerticalTwitterFeed extends StatelessWidget{ @override Widget build(BuildContext context) { + return Container( + child: ListView.builder( + scrollDirection: Axis.vertical, + itemCount: twitterFeed.length, + itemBuilder: (ctx, idx){ + return TwitterCard( + tweet: twitterFeed[idx], + ); + }, + ), + ); + + /* return Container( child: FutureBuilder( future: twitterFeed.getPage(), builder: (ctx, snapshot){ @@ -60,6 +73,6 @@ class VerticalTwitterFeed extends StatelessWidget{ } }, ), - ); + ); */ } } \ No newline at end of file From 71c0c072ab023829895750d6a85116256ce62713 Mon Sep 17 00:00:00 2001 From: kwainright Date: Thu, 9 Apr 2020 20:44:14 -0400 Subject: [PATCH 08/12] Twitter - proof of concept - needs api fleshed out. has place holder data - edited the images --- lib/twitter_assets/tweet.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twitter_assets/tweet.dart b/lib/twitter_assets/tweet.dart index 47aac31..31b571c 100644 --- a/lib/twitter_assets/tweet.dart +++ b/lib/twitter_assets/tweet.dart @@ -47,7 +47,7 @@ class TwitterCard extends StatelessWidget{ padding: EdgeInsets.symmetric(vertical: 10, horizontal: 0), child: ListTile( leading: SizedBox( - height: 125, + height: 150, width: 75, child: Container( decoration: BoxDecoration( From a59b13fc6fe83ddd9013bc438817c98b652c9dbe Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 22:40:58 -0400 Subject: [PATCH 09/12] persistent draggable favorites manager --- lib/route_generator.dart | 12 +++-- lib/screens/favorites_reorder.dart | 82 ++++++++++++++++++++++++++++++ lib/screens/home_widget.dart | 6 +++ pubspec.lock | 35 ++++++++++++- pubspec.yaml | 1 + 5 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 lib/screens/favorites_reorder.dart diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 3e01d5e..75353fe 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -1,4 +1,5 @@ import 'package:capstone_hungry_hippos/screens/chat.dart'; +import 'package:capstone_hungry_hippos/screens/favorites_reorder.dart'; import 'package:capstone_hungry_hippos/screens/schedule.dart'; import 'package:capstone_hungry_hippos/screens/standing.dart'; import 'package:flutter/material.dart'; @@ -6,10 +7,11 @@ import 'package:capstone_hungry_hippos/screens/home_widget.dart'; import 'package:capstone_hungry_hippos/screens/sport.dart'; class RouteGenerator { - static Route generateRoute(RouteSettings settings){ - final args = settings.arguments; //This is how we pass arguments and can be used in case + static Route generateRoute(RouteSettings settings) { + final args = settings + .arguments; //This is how we pass arguments and can be used in case - switch (settings.name){ + switch (settings.name) { case '/': return MaterialPageRoute(builder: (_) => Home()); case '/Sport': @@ -21,13 +23,15 @@ class RouteGenerator { return MaterialPageRoute(builder: (_) => Standing()); case '/Chat': return MaterialPageRoute(builder: (_) => Chat()); + case '/Favorites': + return MaterialPageRoute(builder: (_) => FavoritesManager()); default: return _errorRoute(); } } static Route _errorRoute() { - return MaterialPageRoute(builder: (_){ + return MaterialPageRoute(builder: (_) { return Scaffold( appBar: AppBar( title: Text("Error Page"), diff --git a/lib/screens/favorites_reorder.dart b/lib/screens/favorites_reorder.dart new file mode 100644 index 0000000..3c6ad9a --- /dev/null +++ b/lib/screens/favorites_reorder.dart @@ -0,0 +1,82 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class Favorites { + Future _prefs = SharedPreferences.getInstance(); + + static const List DEFAULT_FAVORITES = [ + 'Football', + 'Basketball', + 'Baseball', + 'Soccer', + 'Tennis', + 'Volleyball' + ]; + + Future> get_favorites() async { + final prefs = await _prefs; + return prefs.getStringList('favorites') ?? DEFAULT_FAVORITES; + } + + Future set_favorites(final List favorites) async { + final prefs = await _prefs; + return await prefs.setStringList('favorites', favorites); + } +} + +class FavoritesManager extends StatefulWidget { + FavoritesManager({Key key}) : super(key: key); + + @override + _FavoritesManagerState createState() => _FavoritesManagerState(); +} + +class _FavoritesManagerState extends State { + Favorites _mgr = Favorites(); + Future> _order; + + @override + void initState() { + _order = _mgr.get_favorites(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: false, + title: Text('Manage Favorites'), + backgroundColor: Colors.green, + ), + body: FutureBuilder>( + future: _order, + builder: (ctx, snap) { + if (snap.connectionState == ConnectionState.waiting) { + return CircularProgressIndicator(); + } else { + var order = snap.data.toList(); + return ReorderableListView( + onReorder: (int oldIdx, int newIdx) { + if (newIdx > oldIdx) newIdx--; + order.insert(newIdx, order.removeAt(oldIdx)); + + setState(() { + _mgr.set_favorites(order); + _order = Future.value(order); + }); + }, + children: order.map((sport) { + return ListTile( + key: Key(sport), + title: Text(sport), + trailing: Icon(Icons.drag_handle), + ); + }).toList(), + ); + } + }, + ), + ); + } +} diff --git a/lib/screens/home_widget.dart b/lib/screens/home_widget.dart index 6c0488d..8e42ed9 100644 --- a/lib/screens/home_widget.dart +++ b/lib/screens/home_widget.dart @@ -32,6 +32,12 @@ class Home extends StatelessWidget { onPressed: () => Navigator.pushNamed(context, '/Chat'), ), ), + ListTile( + title: IconButton( + icon: Icon(Icons.settings), + onPressed: ()=>Navigator.pushNamed(context, '/Favorites'), + ), + ) ], ), ), diff --git a/pubspec.lock b/pubspec.lock index eeaa3b1..764cf68 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -88,6 +88,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" http: dependency: "direct main" description: @@ -172,6 +177,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.23.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "0.5.6+3" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "0.0.1+6" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.2+4" sky_engine: dependency: transitive description: flutter @@ -242,4 +275,4 @@ packages: version: "3.5.0" sdks: dart: ">=2.6.0 <3.0.0" - flutter: ">=1.12.1" + flutter: ">=1.12.13+hotfix.4 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 7cf311d..43653d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: flutter_bloc: ^3.2.0 http: ^0.12.0+4 + shared_preferences: ^0.5.6+3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 96d88a8a820b5a2290a40fc995541e0745d337d5 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 22:52:13 -0400 Subject: [PATCH 10/12] initial list determined by favorites order --- lib/screens/home_widget.dart | 43 ++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/lib/screens/home_widget.dart b/lib/screens/home_widget.dart index 8e42ed9..73281d5 100644 --- a/lib/screens/home_widget.dart +++ b/lib/screens/home_widget.dart @@ -1,3 +1,5 @@ +import 'package:capstone_hungry_hippos/screens/favorites_reorder.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import '../news/feed.dart'; @@ -5,11 +7,20 @@ class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - body: CustomScrollView( - slivers: [ - _AppBar(), - SliverList(delegate: SliverChildListDelegate(_buildList())), - ], + body: FutureBuilder( + future: _buildList(), + builder: (ctx, snap) { + if (snap.hasData) { + return CustomScrollView( + slivers: [ + _AppBar(), + SliverList(delegate: SliverChildListDelegate(snap.data)), + ], + ); + } else { + return CircularProgressIndicator(); + } + }, ), drawer: Drawer( child: ListView( @@ -35,7 +46,7 @@ class Home extends StatelessWidget { ListTile( title: IconButton( icon: Icon(Icons.settings), - onPressed: ()=>Navigator.pushNamed(context, '/Favorites'), + onPressed: () => Navigator.pushNamed(context, '/Favorites'), ), ) ], @@ -56,15 +67,15 @@ class _AppBar extends StatelessWidget { } } -List _buildList() { +Future> _buildList() async { final feed = Feed(); - List listItems = List(); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Football"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Soccer"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Basketball"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Volleyball"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Baseball"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Softball"))); - listItems.add(HorizontalNewsFeed(newsFeed: feed, title: Text("Tennis"))); - return listItems; + final mgr = Favorites(); + final sports = await mgr.get_favorites(); + + return sports.map((sport) { + return HorizontalNewsFeed( + newsFeed: feed, + title: Text(sport), + ); + }).toList(); } From e8a98082032c67d532d5eee329487ea0fc89bcc4 Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 23:00:22 -0400 Subject: [PATCH 11/12] resort main page after order updated --- lib/screens/home_widget.dart | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/screens/home_widget.dart b/lib/screens/home_widget.dart index 73281d5..abfbbe4 100644 --- a/lib/screens/home_widget.dart +++ b/lib/screens/home_widget.dart @@ -3,7 +3,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import '../news/feed.dart'; -class Home extends StatelessWidget { +class Home extends StatefulWidget { + @override + _HomeState createState() => _HomeState(); +} + +class _HomeState extends State { @override Widget build(BuildContext context) { return Scaffold( @@ -46,7 +51,10 @@ class Home extends StatelessWidget { ListTile( title: IconButton( icon: Icon(Icons.settings), - onPressed: () => Navigator.pushNamed(context, '/Favorites'), + onPressed: () => + Navigator.pushNamed(context, '/Favorites').then((e) { + setState(() {}); + }), ), ) ], From 0bf3de6916cc8133ec36162735a8cc0a69bcc66d Mon Sep 17 00:00:00 2001 From: Carlos Lopez-Rosario Date: Fri, 10 Apr 2020 13:30:50 -0400 Subject: [PATCH 12/12] Added missing import --- lib/route_generator.dart | 1 + pubspec.lock | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/route_generator.dart b/lib/route_generator.dart index d6f5ba9..ac14084 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:capstone_hungry_hippos/screens/home_widget.dart'; import 'package:capstone_hungry_hippos/screens/sport.dart'; import 'package:capstone_hungry_hippos/screens/twitter_widget.dart'; +import 'package:capstone_hungry_hippos/screens/favorites_reorder.dart'; class RouteGenerator { static Route generateRoute(RouteSettings settings) { diff --git a/pubspec.lock b/pubspec.lock index 764cf68..3e6efa1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,21 +7,21 @@ packages: name: archive url: "https://pub.dartlang.org" source: hosted - version: "2.0.11" + version: "2.0.13" args: dependency: transitive description: name: args url: "https://pub.dartlang.org" source: hosted - version: "1.5.2" + version: "1.6.0" async: dependency: transitive description: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.4.0" + version: "2.4.1" bloc: dependency: transitive description: @@ -35,21 +35,21 @@ packages: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.0.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.1.3" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.14.12" convert: dependency: transitive description: @@ -63,7 +63,7 @@ packages: name: crypto url: "https://pub.dartlang.org" source: hosted - version: "2.1.3" + version: "2.1.4" cupertino_icons: dependency: "direct main" description: @@ -113,7 +113,7 @@ packages: name: image url: "https://pub.dartlang.org" source: hosted - version: "2.1.4" + version: "2.1.12" matcher: dependency: transitive description: @@ -169,7 +169,7 @@ packages: name: quiver url: "https://pub.dartlang.org" source: hosted - version: "2.0.5" + version: "2.1.3" rxdart: dependency: transitive description: @@ -216,7 +216,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.7.0" stack_trace: dependency: transitive description: @@ -251,7 +251,7 @@ packages: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.11" + version: "0.2.15" typed_data: dependency: transitive description: @@ -272,7 +272,7 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.5.0" + version: "3.6.1" sdks: dart: ">=2.6.0 <3.0.0" flutter: ">=1.12.13+hotfix.4 <2.0.0"