Skip to content

Commit

Permalink
persitent theming, animated icons, config screen
Browse files Browse the repository at this point in the history
  • Loading branch information
richtwin567 committed Aug 21, 2020
1 parent 1912099 commit f53668f
Show file tree
Hide file tree
Showing 32 changed files with 480 additions and 205 deletions.
1 change: 1 addition & 0 deletions assets/rive_animated_icons/clear-white-24dp.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/rive_animated_icons/search-white-24dp.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/rive_animated_icons/search_clear.flr
Binary file not shown.
Binary file not shown.
55 changes: 33 additions & 22 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,38 +1,49 @@
import 'package:device_preview/device_preview.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:fst_app_flutter/models/theme_model.dart';
import 'package:fst_app_flutter/models/preferences/theme_model.dart';
import 'package:fst_app_flutter/routing/generate_routes.dart';

import 'package:fst_app_flutter/utils/app_theme.dart';
import 'package:provider/provider.dart';

void main() {
runApp(DevicePreview(child: FSTApp()));
void main() async {
WidgetsFlutterBinding.ensureInitialized();
ThemeModel themeModel = ThemeModel();
await themeModel.init();
runApp(DevicePreview(
child: FSTApp(
themeModel: themeModel,
)));
}

class FSTApp extends StatelessWidget {
final ThemeModel themeModel;

FSTApp({Key key, this.themeModel}) : super(key: key);
// This widget is the root of the application.
@override
Widget build(BuildContext context) {

return ChangeNotifierProvider(
create: (context) => ThemeModel(),
child: Consumer<ThemeModel>(
builder:(context, themeModel, child) {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: AppTheme.getTheme(themeModel.selectedTheme,MediaQuery.platformBrightnessOf(context)).primaryColor,
));
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: AppTheme.getTheme(ThemeMode.light, MediaQuery.platformBrightnessOf(context)),
darkTheme: AppTheme.getTheme(ThemeMode.dark, MediaQuery.platformBrightnessOf(context)),
themeMode: themeModel.selectedTheme,
title: 'FST App',
builder: DevicePreview.appBuilder,
onGenerateRoute: Router.generateRoute,
);
},
));
create: (context) => themeModel,
builder: (context, child) => Consumer<ThemeModel>(
builder: (context, themeModel, child) {
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: AppTheme.getTheme(themeModel.selectedTheme,
MediaQuery.platformBrightnessOf(context))
.primaryColor,
));
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: AppTheme.getTheme(ThemeMode.light,
MediaQuery.platformBrightnessOf(context)),
darkTheme: AppTheme.getTheme(
ThemeMode.dark, MediaQuery.platformBrightnessOf(context)),
themeMode: themeModel.selectedTheme,
title: 'FST App',
builder: DevicePreview.appBuilder,
onGenerateRoute: Router.generateRoute,
);
},
));
}
}
8 changes: 0 additions & 8 deletions lib/models/contact_view_model.dart

This file was deleted.

21 changes: 21 additions & 0 deletions lib/models/preferences/theme_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fst_app_flutter/models/preferences/theme_preference.dart';

class ThemeModel with ChangeNotifier {
static ThemePreference _themePreference = ThemePreference();
//set to system theme by default
ThemeMode _currentTheme;

init() async {
_currentTheme = await _themePreference.mode;
}

ThemeMode get selectedTheme => _currentTheme;

switchThemeTo(ThemeMode themeMode) {
_currentTheme = themeMode;
_themePreference.setThemeMode(themeMode);
notifyListeners();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

class ThemePreference {
var lightThemeStatus = ThemeMode.light.toString();
Expand All @@ -12,7 +13,7 @@ class ThemePreference {
}

setThemeMode(ThemeMode option) async {
_initializeFromDisk();
await _initializeFromDisk();
if (option == ThemeMode.dark) {
prefs.setBool(darkThemeStatus, true);
prefs.setBool(lightThemeStatus, false);
Expand All @@ -27,9 +28,9 @@ class ThemePreference {
prefs.setBool(systemThemeStatus, true);
}
}
ThemeMode get mode {
_initializeFromDisk();

Future<ThemeMode> get mode async {
await _initializeFromDisk();
if (prefs.getBool(darkThemeStatus) ?? false) {
return ThemeMode.dark;
} else if (prefs.getBool(lightThemeStatus) ?? false) {
Expand Down
17 changes: 0 additions & 17 deletions lib/models/theme_model.dart

This file was deleted.

6 changes: 4 additions & 2 deletions lib/routing/generate_routes.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:fst_app_flutter/routing/slide_up_route.dart';
import 'package:fst_app_flutter/screens/app_preferences_screen/app_preferences_view.dart';
import 'package:fst_app_flutter/screens/contact_screen/contact_detail_page.dart';
import 'package:fst_app_flutter/screens/contact_screen/contact_view.dart';
import 'package:fst_app_flutter/screens/homescreen/home_view.dart';
Expand All @@ -14,9 +15,10 @@ class Router {
return MaterialPageRoute(builder: (context) => ContactView());
case contactDetailRoute:
return SlideUpPageRoute(page: ContactDetailPage(settings.arguments));
case appPreferencesRoute:
return MaterialPageRoute(builder: (context) => AppPreferencesView());
default:
return MaterialPageRoute(
builder: (context) => HomeView());
return MaterialPageRoute(builder: (context) => HomeView());
}
}
}
3 changes: 3 additions & 0 deletions lib/routing/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ const contactRoute = '/contact';

/// [ContactDetailPage] route
const contactDetailRoute = '/contactDetail';

/// [AppPreferencesView] route
const appPreferencesRoute = '/appConfig';
9 changes: 5 additions & 4 deletions lib/routing/slide_up_route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ class SlideUpPageRoute extends PageRouteBuilder {

SlideUpPageRoute({@required this.page})
: super(
transitionDuration: Duration(milliseconds: 400),
transitionDuration: Duration(milliseconds: 400),
pageBuilder: (context, animation1, animation2) => page,
transitionsBuilder: (context, animation1, animation2, child) =>
SlideTransition(
position: Tween<Offset>(
begin: const Offset(0, 1), end: Offset.zero)
.animate(CurvedAnimation(parent: animation1, curve: Curves.easeOut)),
position:
Tween<Offset>(begin: const Offset(0, 1), end: Offset.zero)
.animate(CurvedAnimation(
parent: animation1, curve: Curves.easeOut)),
child: child,
));
}
28 changes: 28 additions & 0 deletions lib/routing/stateful_popup_route.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'package:flutter/material.dart';

class StatefulPopupRoute extends PopupRoute {
Widget page;

StatefulPopupRoute({RouteSettings settings, this.page})
: super(
settings: settings,
);

@override
Color get barrierColor => Colors.black54;

@override
bool get barrierDismissible => true;

@override
String get barrierLabel => 'Stateful popup barrier';

@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return page;
}

@override
Duration get transitionDuration => Duration(milliseconds: 300);
}
23 changes: 23 additions & 0 deletions lib/screens/app_preferences_screen/app_preferences_view.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:fst_app_flutter/screens/app_preferences_screen/app_preferences_view_mobile.dart';
import 'package:fst_app_flutter/screens/app_preferences_screen/app_preferences_view_tablet.dart';
import 'package:fst_app_flutter/widgets/orientation_layout.dart';
import 'package:fst_app_flutter/widgets/screen_type_layout.dart';

class AppPreferencesView extends StatelessWidget {
const AppPreferencesView({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return ScreenTypeLayout(
mobile: OrientationLayout(
portrait: (context) => AppPreferencesViewMobilePortrait(),
landscape: (context) => AppPreferencesViewMobileLandscape(),
),
tablet: OrientationLayout(
portrait: (context) => AppPreferencesViewTabletPortrait(),
landscape: (context) => AppPreferencesViewTabletLandscape(),
),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
import 'package:fst_app_flutter/models/preferences/theme_model.dart';
import 'package:fst_app_flutter/routing/stateful_popup_route.dart';
import 'package:fst_app_flutter/widgets/preferences/theme_chooser_dialog.dart';
import 'package:provider/provider.dart';

class AppPreferencesViewMobileLandscape extends StatelessWidget {
const AppPreferencesViewMobileLandscape({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container();
}
}

class AppPreferencesViewMobilePortrait extends StatelessWidget {
const AppPreferencesViewMobilePortrait({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Settings'),
centerTitle: false,
),
body: Consumer<ThemeModel>(builder: (context, themeModel, child) {
return ListView(children: [
ListTile(
leading: Icon(Icons.brush),
title: Text('Theme'),
subtitle:
Text(themeModel.selectedTheme.toString().substring(10)),
onTap: () => Navigator.push(
context,
StatefulPopupRoute(
page: ThemeChooserDialog(),
settings: RouteSettings(arguments: themeModel)),
)),
Divider(),
]);
}));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:flutter/material.dart';

class AppPreferencesViewTabletLandscape extends StatelessWidget {
const AppPreferencesViewTabletLandscape({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
);
}
}

class AppPreferencesViewTabletPortrait extends StatelessWidget {
const AppPreferencesViewTabletPortrait({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Container(
);
}
}
6 changes: 3 additions & 3 deletions lib/screens/contact_screen/contact_detail_page.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:fst_app_flutter/widgets/contact_card.dart';
import 'package:fst_app_flutter/utils/open_url.dart';
import 'package:fst_app_flutter/widgets/contact_detail_image.dart';
import 'package:fst_app_flutter/widgets/contact_widgets/contact_card.dart';
import 'package:fst_app_flutter/widgets/contact_widgets/contact_detail_image.dart';

/// A page that shows all the details for the selected contact.
/// It allows the user to open websites, call the contact and send an email to
Expand Down Expand Up @@ -38,7 +38,7 @@ class ContactDetailPage extends StatelessWidget {
mq.size.width / 2, (mq.size.height / 2.5) / 2),
scale:
(mq.devicePixelRatio / mq.size.aspectRatio) * 1.5,
color: Colors.blue[800])),
color: Theme.of(context).primaryColorDark)),
title: Padding(
padding: EdgeInsets.only(right: mq.size.width / 4),
child: Text(
Expand Down
Loading

0 comments on commit f53668f

Please sign in to comment.