Skip to content

Instantly share code, notes, and snippets.

@khatthaphone
Created March 9, 2020 03:57
Show Gist options
  • Save khatthaphone/7d151e07c5ad2294ef758ae93cd694aa to your computer and use it in GitHub Desktop.
Save khatthaphone/7d151e07c5ad2294ef758ae93cd694aa to your computer and use it in GitHub Desktop.
Flutter Provider sample
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutterapp/model/user.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) =>
User(
'Tony Stark', DateTime.parse('1970-05-29'), 'Billionaire',
720),
),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyWidget(),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
final inputBorder = OutlineInputBorder(
borderSide: BorderSide(color: Theme
.of(context)
.primaryColor));
final dobController = TextEditingController(
text: user.dateOfBirth.toIso8601String().substring(0, 10));
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Container(
padding: EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
TextFormField(
initialValue: user.name,
decoration: InputDecoration(
labelText: 'Name',
enabledBorder: inputBorder,
focusedBorder: inputBorder,
),
onChanged: (text) {
user.name = text;
},
),
SizedBox(height: 10),
TextFormField(
initialValue: user.job,
decoration: InputDecoration(
labelText: 'Job',
enabledBorder: inputBorder,
focusedBorder: inputBorder,
),
onChanged: (text) {
user.job = text;
},
),
SizedBox(height: 10),
TextFormField(
decoration: InputDecoration(
labelText: 'Date of Birth',
enabledBorder: inputBorder,
focusedBorder: inputBorder,
),
controller: dobController,
onTap: () async {
final date = await showDatePicker(
context: context,
initialDate: user.dateOfBirth,
firstDate: DateTime.parse('1970-01-01'),
lastDate: DateTime.now());
if (date != null) {
user.dateOfBirth = date;
dobController.text =
date.toIso8601String().substring(0, 10);
}
},
),
SizedBox(height: 10),
TextFormField(
initialValue: '${user.money}',
decoration: InputDecoration(
labelText: 'Money',
enabledBorder: inputBorder,
focusedBorder: inputBorder,
),
inputFormatters: [WhitelistingTextInputFormatter.digitsOnly],
onChanged: (text) {
if (text.length > 0) {
user.money = int.parse(text);
} else {
user.money = 0;
}
},
),
SizedBox(height: 50),
Preview()
],
),
),
),
);
}
}
class Preview extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Card(color: Colors.red, elevation: 10,
child: Padding(padding: EdgeInsets.all(16), child: PreviewChild1()));
}
}
class PreviewChild1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Card(color: Colors.blue, elevation: 10,
child: Padding(padding: EdgeInsets.all(16), child: PreviewChild2()));
}
}
class PreviewChild2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Card(color: Colors.green, elevation: 10,
child: Padding(padding: EdgeInsets.all(16), child: PreviewChild3()));
}
}
class PreviewChild3 extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
final f = NumberFormat('#,###', 'en_US');
return Card(
elevation: 5,
child: Padding(
padding: EdgeInsets.all(16),
child: Column(
children: <Widget>[
Text('Name: ${user.name}'),
Text(
'Name: ${user.dateOfBirth.toIso8601String().substring(
0, 10)}'),
Text('Job: ${user.job}'),
Text('Money: \$${f.format(user.money)}'),
],
)),
);
}
}
name: flutterapp
description: A new Flutter application.
# 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.1.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.2
provider: ^4.0.2
intl: ^0.16.1
dev_dependencies:
flutter_test:
sdk: flutter
# 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/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
# 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
import 'package:flutter/material.dart';
class User with ChangeNotifier {
String _name = '';
DateTime _dateOfBirth;
String _job = '';
int _money = 0;
User(this._name, this._dateOfBirth, this._job, this._money);
String get name => _name;
DateTime get dateOfBirth => _dateOfBirth;
String get job => _job;
int get money => _money;
set name(String name) {
_name = name;
notifyListeners();
}
set dateOfBirth(DateTime dateOfBirth) {
_dateOfBirth = dateOfBirth;
notifyListeners();
}
set job(String job) {
_job = job;
notifyListeners();
}
set money(int money) {
_money = money;
notifyListeners();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment