Skip to content

Instantly share code, notes, and snippets.

@tiagolpadua
Created September 22, 2020 02:14
Show Gist options
  • Save tiagolpadua/efb8542fc9d58deb7db6a78423c97f29 to your computer and use it in GitHub Desktop.
Save tiagolpadua/efb8542fc9d58deb7db6a78423c97f29 to your computer and use it in GitHub Desktop.
Dynamic Theme Changing Challange
import 'package:bytebank/main.dart';
import 'package:bytebank/screens/contact/list.dart';
import 'package:bytebank/screens/transactions/list.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Dashboard extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Dashboard'), actions: <Widget>[
// action button
IconButton(
icon: Icon(Icons.lightbulb_outline),
onPressed: () {
Provider.of<AppConfig>(context, listen: false).toggle();
},
),
]),
body: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(8.0),
child: Image.asset('images/bytebank_logo.png'),
),
Container(
height: 120,
child: ListView(
scrollDirection: Axis.horizontal,
children: [
_FeatureItem(
'Transfer',
Icons.monetization_on,
onClick: () {
_showContactsList(context);
},
),
_FeatureItem(
'Transaction Feed',
Icons.description,
onClick: () => _showTransactionsList(context),
),
],
),
),
],
),
);
}
void _showContactsList(BuildContext context) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ContactsList(),
),
);
}
_showTransactionsList(BuildContext context) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => TransactionsList(),
),
);
}
}
class _FeatureItem extends StatelessWidget {
final String name;
final IconData icon;
final Function onClick;
_FeatureItem(
this.name,
this.icon, {
@required this.onClick,
}) : assert(icon != null),
assert(onClick != null);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Material(
color: Theme.of(context).primaryColor,
child: InkWell(
onTap: () => onClick(),
child: Container(
padding: EdgeInsets.all(8.0),
width: 150,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Icon(
icon,
color: Colors.white,
size: 24.0,
),
Text(
name,
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
),
),
],
),
),
),
),
);
}
}
import 'package:bytebank/screens/dashboard.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() => runApp(
ChangeNotifierProvider.value(
value: AppConfig(),
child: BytebankApp(),
),
);
class BytebankApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: Provider.of<AppConfig>(context).darkMode
? ThemeData.dark()
: bytebankTheme(),
home: Dashboard(),
);
}
}
class AppConfig extends ChangeNotifier {
bool _darkMode = false;
bool get darkMode {
return _darkMode;
}
void toggle() {
this._darkMode = !this._darkMode;
print('toggle: ${this._darkMode}');
notifyListeners();
}
}
ThemeData bytebankTheme() {
return ThemeData(
primaryColor: Colors.green[900],
accentColor: Colors.blueAccent[700],
buttonTheme: ButtonThemeData(
buttonColor: Colors.blueAccent[700],
textTheme: ButtonTextTheme.primary,
),
);
}
name: bytebank
description: A new Flutter project.
# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.3
dev_dependencies:
flutter_test:
sdk: flutter
sqflite:
path:
provider: ^4.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- images/bytebank_logo.png
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
# For details regarding adding assets from package dependencies, see
# https://flutter.dev/assets-and-images/#from-packages
# To add custom fonts to your application, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment