From b929018c9b2da6737f2574404953b6fd34dbcdee Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 14:40:15 -0400 Subject: [PATCH 1/4] 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 a59b13fc6fe83ddd9013bc438817c98b652c9dbe Mon Sep 17 00:00:00 2001 From: David Allemang Date: Thu, 9 Apr 2020 22:40:58 -0400 Subject: [PATCH 2/4] 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 3/4] 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 4/4] 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(() {}); + }), ), ) ],