Revert "Restore "Flutter gallery: updated Shrine demo" (#23878)" (#23888)
This reverts commit 76a1abd4c779a3f54f6a6a49340eca03a99d522c.
diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml
index 1b0a2b2..ea89315 100644
--- a/dev/automated_tests/pubspec.yaml
+++ b/dev/automated_tests/pubspec.yaml
@@ -10,7 +10,7 @@
flutter_test:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -19,7 +19,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -28,7 +28,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -41,7 +41,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -65,4 +65,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 53cf
+# PUBSPEC CHECKSUM: e771
diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml
index fd39dcc..cc4578a 100644
--- a/dev/benchmarks/complex_layout/pubspec.yaml
+++ b/dev/benchmarks/complex_layout/pubspec.yaml
@@ -40,11 +40,11 @@
flutter_test:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -52,7 +52,7 @@
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -62,7 +62,7 @@
package_resolver: 1.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -82,4 +82,4 @@
- packages/flutter_gallery_assets/people/square/ali.png
- packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
-# PUBSPEC CHECKSUM: 9f9f
+# PUBSPEC CHECKSUM: d841
diff --git a/dev/benchmarks/microbenchmarks/pubspec.yaml b/dev/benchmarks/microbenchmarks/pubspec.yaml
index ca04aaa..1fb2857 100644
--- a/dev/benchmarks/microbenchmarks/pubspec.yaml
+++ b/dev/benchmarks/microbenchmarks/pubspec.yaml
@@ -14,7 +14,7 @@
stocks:
path: ../../../examples/stocks
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -24,7 +24,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dart_style: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -36,7 +36,7 @@
isolate: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -49,7 +49,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -73,4 +73,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 3826
+# PUBSPEC CHECKSUM: f9c7
diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml
index 38fae6e..378eee8 100644
--- a/dev/bots/pubspec.yaml
+++ b/dev/bots/pubspec.yaml
@@ -27,19 +27,19 @@
test: 1.3.4
mockito: 3.0.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_multi_server: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -65,4 +65,4 @@
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: c16e
+# PUBSPEC CHECKSUM: 1cb4
diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml
index 6a52050..b6d156a 100644
--- a/dev/devicelab/pubspec.yaml
+++ b/dev/devicelab/pubspec.yaml
@@ -38,10 +38,10 @@
# See packages/flutter_test/pubspec.yaml for why we're pinning this version.
test: 1.3.4
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -49,7 +49,7 @@
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -71,4 +71,4 @@
watcher: 0.9.7+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: 9154
+# PUBSPEC CHECKSUM: e39a
diff --git a/dev/integration_tests/android_views/pubspec.yaml b/dev/integration_tests/android_views/pubspec.yaml
index 2ac0665..26af712 100644
--- a/dev/integration_tests/android_views/pubspec.yaml
+++ b/dev/integration_tests/android_views/pubspec.yaml
@@ -36,11 +36,11 @@
flutter_goldens:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -48,7 +48,7 @@
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -60,7 +60,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
process: 3.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -77,4 +77,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 2fce
+# PUBSPEC CHECKSUM: 3b70
diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml
index bb557ca..a50a5e7 100644
--- a/dev/integration_tests/ui/pubspec.yaml
+++ b/dev/integration_tests/ui/pubspec.yaml
@@ -40,10 +40,10 @@
sdk: flutter
test: 1.3.4
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -51,7 +51,7 @@
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -61,7 +61,7 @@
package_resolver: 1.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -77,4 +77,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: fb2a
+# PUBSPEC CHECKSUM: d2cb
diff --git a/dev/manual_tests/pubspec.yaml b/dev/manual_tests/pubspec.yaml
index 2cded97..af8e42e 100644
--- a/dev/manual_tests/pubspec.yaml
+++ b/dev/manual_tests/pubspec.yaml
@@ -19,7 +19,7 @@
mockito: 3.0.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -27,7 +27,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -36,7 +36,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -48,7 +48,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -70,4 +70,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 1f13
+# PUBSPEC CHECKSUM: 70b4
diff --git a/dev/snippets/pubspec.yaml b/dev/snippets/pubspec.yaml
index 920082d..7d76fc3 100644
--- a/dev/snippets/pubspec.yaml
+++ b/dev/snippets/pubspec.yaml
@@ -18,17 +18,17 @@
meta: 1.1.6
platform: 2.2.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -98,4 +98,4 @@
vm_service_client: 0.2.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: fc32
+# PUBSPEC CHECKSUM: f478
diff --git a/dev/tools/pubspec.yaml b/dev/tools/pubspec.yaml
index 292ee55..55c1c61 100644
--- a/dev/tools/pubspec.yaml
+++ b/dev/tools/pubspec.yaml
@@ -30,17 +30,17 @@
test: 1.3.4
mockito: 3.0.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_multi_server: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -66,4 +66,4 @@
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: 32a0
+# PUBSPEC CHECKSUM: dee6
diff --git a/dev/tools/vitool/pubspec.yaml b/dev/tools/vitool/pubspec.yaml
index 9066c0b..a0ac764 100644
--- a/dev/tools/vitool/pubspec.yaml
+++ b/dev/tools/vitool/pubspec.yaml
@@ -20,14 +20,14 @@
flutter_test:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -36,7 +36,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -49,7 +49,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -69,4 +69,4 @@
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: c974
+# PUBSPEC CHECKSUM: ec16
diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml
index 454e64b..5900975 100644
--- a/examples/catalog/pubspec.yaml
+++ b/examples/catalog/pubspec.yaml
@@ -21,7 +21,7 @@
flutter_driver:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -30,7 +30,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -40,7 +40,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -51,7 +51,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -73,4 +73,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 3901
+# PUBSPEC CHECKSUM: 27a2
diff --git a/examples/flutter_gallery/lib/demo/shrine/app.dart b/examples/flutter_gallery/lib/demo/shrine/app.dart
deleted file mode 100644
index e5eae3a..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/app.dart
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-
-import 'package:flutter_gallery/demo/shrine/backdrop.dart';
-import 'package:flutter_gallery/demo/shrine/category_menu_page.dart';
-import 'package:flutter_gallery/demo/shrine/colors.dart';
-import 'package:flutter_gallery/demo/shrine/expanding_bottom_sheet.dart';
-import 'package:flutter_gallery/demo/shrine/home.dart';
-import 'package:flutter_gallery/demo/shrine/login.dart';
-import 'package:flutter_gallery/demo/shrine/supplemental/cut_corners_border.dart';
-
-class ShrineApp extends StatefulWidget {
- @override
- _ShrineAppState createState() => _ShrineAppState();
-}
-
-class _ShrineAppState extends State<ShrineApp> with SingleTickerProviderStateMixin {
- // Controller to coordinate both the opening/closing of backdrop and sliding
- // of expanding bottom sheet
- AnimationController _controller;
-
- @override
- void initState() {
- super.initState();
- _controller = AnimationController(
- vsync: this,
- duration: const Duration(milliseconds: 450),
- value: 1.0,
- );
- }
-
- @override
- Widget build(BuildContext context) {
- return MaterialApp(
- title: 'Shrine',
- home: HomePage(
- backdrop: Backdrop(
- frontLayer: const ProductPage(),
- backLayer: CategoryMenuPage(onCategoryTap: () => _controller.forward()),
- frontTitle: const Text('SHRINE'),
- backTitle: const Text('MENU'),
- controller: _controller,
- ),
- expandingBottomSheet: ExpandingBottomSheet(hideController: _controller),
- ),
- initialRoute: '/login',
- onGenerateRoute: _getRoute,
- theme: _kShrineTheme,
- );
- }
-}
-
-Route<dynamic> _getRoute(RouteSettings settings) {
- if (settings.name != '/login') {
- return null;
- }
-
- return MaterialPageRoute<void>(
- settings: settings,
- builder: (BuildContext context) => LoginPage(),
- fullscreenDialog: true,
- );
-}
-
-final ThemeData _kShrineTheme = _buildShrineTheme();
-
-IconThemeData _customIconTheme(IconThemeData original) {
- return original.copyWith(color: kShrineBrown900);
-}
-
-ThemeData _buildShrineTheme() {
- final ThemeData base = ThemeData.light();
- return base.copyWith(
- colorScheme: kShrineColorScheme,
- accentColor: kShrineBrown900,
- primaryColor: kShrinePink100,
- buttonColor: kShrinePink100,
- scaffoldBackgroundColor: kShrineBackgroundWhite,
- cardColor: kShrineBackgroundWhite,
- textSelectionColor: kShrinePink100,
- errorColor: kShrineErrorRed,
- buttonTheme: const ButtonThemeData(
- colorScheme: kShrineColorScheme,
- textTheme: ButtonTextTheme.normal,
- ),
- primaryIconTheme: _customIconTheme(base.iconTheme),
- inputDecorationTheme: const InputDecorationTheme(border: CutCornersBorder()),
- textTheme: _buildShrineTextTheme(base.textTheme),
- primaryTextTheme: _buildShrineTextTheme(base.primaryTextTheme),
- accentTextTheme: _buildShrineTextTheme(base.accentTextTheme),
- iconTheme: _customIconTheme(base.iconTheme),
- );
-}
-
-TextTheme _buildShrineTextTheme(TextTheme base) {
- return base.copyWith(
- headline: base.headline.copyWith(fontWeight: FontWeight.w500),
- title: base.title.copyWith(fontSize: 18.0),
- caption: base.caption.copyWith(fontWeight: FontWeight.w400, fontSize: 14.0),
- body2: base.body2.copyWith(fontWeight: FontWeight.w500, fontSize: 16.0),
- button: base.button.copyWith(fontWeight: FontWeight.w500, fontSize: 14.0),
- ).apply(
- fontFamily: 'Raleway',
- displayColor: kShrineBrown900,
- bodyColor: kShrineBrown900,
- );
-}
-
-const ColorScheme kShrineColorScheme = ColorScheme(
- primary: kShrinePink100,
- primaryVariant: kShrineBrown900,
- secondary: kShrinePink50,
- secondaryVariant: kShrineBrown900,
- surface: kShrineSurfaceWhite,
- background: kShrineBackgroundWhite,
- error: kShrineErrorRed,
- onPrimary: kShrineBrown900,
- onSecondary: kShrineBrown900,
- onSurface: kShrineBrown900,
- onBackground: kShrineBrown900,
- onError: kShrineSurfaceWhite,
- brightness: Brightness.light,
-);
diff --git a/examples/flutter_gallery/lib/demo/shrine/backdrop.dart b/examples/flutter_gallery/lib/demo/shrine/backdrop.dart
deleted file mode 100644
index 2e79fae..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/backdrop.dart
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-import 'package:meta/meta.dart';
-
-import 'package:flutter_gallery/demo/shrine/login.dart';
-
-const Cubic _kAccelerateCurve = Cubic(0.548, 0.0, 0.757, 0.464);
-const Cubic _kDecelerateCurve = Cubic(0.23, 0.94, 0.41, 1.0);
-const double _kPeakVelocityTime = 0.248210;
-const double _kPeakVelocityProgress = 0.379146;
-
-class _FrontLayer extends StatelessWidget {
- const _FrontLayer({
- Key key,
- this.onTap,
- this.child,
- }) : super(key: key);
-
- final VoidCallback onTap;
- final Widget child;
-
- @override
- Widget build(BuildContext context) {
- return Material(
- elevation: 16.0,
- shape: const BeveledRectangleBorder(
- borderRadius: BorderRadius.only(topLeft: Radius.circular(46.0)),
- ),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: <Widget>[
- GestureDetector(
- behavior: HitTestBehavior.opaque,
- onTap: onTap,
- child: Container(
- height: 40.0,
- alignment: AlignmentDirectional.centerStart,
- ),
- ),
- Expanded(
- child: child,
- ),
- ],
- ),
- );
- }
-}
-
-class _BackdropTitle extends AnimatedWidget {
- const _BackdropTitle({
- Key key,
- Listenable listenable,
- this.onPress,
- @required this.frontTitle,
- @required this.backTitle,
- }) : assert(frontTitle != null),
- assert(backTitle != null),
- super(key: key, listenable: listenable);
-
- final Function onPress;
- final Widget frontTitle;
- final Widget backTitle;
-
- @override
- Widget build(BuildContext context) {
- final Animation<double> animation = CurvedAnimation(
- parent: listenable,
- curve: const Interval(0.0, 0.78),
- );
-
- return DefaultTextStyle(
- style: Theme.of(context).primaryTextTheme.title,
- softWrap: false,
- overflow: TextOverflow.ellipsis,
- child: Row(children: <Widget>[
- // branded icon
- SizedBox(
- width: 72.0,
- child: IconButton(
- padding: const EdgeInsets.only(right: 8.0),
- onPressed: onPress,
- icon: Stack(children: <Widget>[
- Opacity(
- opacity: animation.value,
- child: const ImageIcon(AssetImage('packages/shrine_images/slanted_menu.png')),
- ),
- FractionalTranslation(
- translation: Tween<Offset>(
- begin: Offset.zero,
- end: const Offset(1.0, 0.0),
- ).evaluate(animation),
- child: const ImageIcon(AssetImage('packages/shrine_images/diamond.png')),
- )
- ]),
- ),
- ),
- // Here, we do a custom cross fade between backTitle and frontTitle.
- // This makes a smooth animation between the two texts.
- Stack(
- children: <Widget>[
- Opacity(
- opacity: CurvedAnimation(
- parent: ReverseAnimation(animation),
- curve: const Interval(0.5, 1.0),
- ).value,
- child: FractionalTranslation(
- translation: Tween<Offset>(
- begin: Offset.zero,
- end: const Offset(0.5, 0.0),
- ).evaluate(animation),
- child: backTitle,
- ),
- ),
- Opacity(
- opacity: CurvedAnimation(
- parent: animation,
- curve: const Interval(0.5, 1.0),
- ).value,
- child: FractionalTranslation(
- translation: Tween<Offset>(
- begin: const Offset(-0.25, 0.0),
- end: Offset.zero,
- ).evaluate(animation),
- child: frontTitle,
- ),
- ),
- ],
- )
- ]),
- );
- }
-}
-
-/// Builds a Backdrop.
-///
-/// A Backdrop widget has two layers, front and back. The front layer is shown
-/// by default, and slides down to show the back layer, from which a user
-/// can make a selection. The user can also configure the titles for when the
-/// front or back layer is showing.
-class Backdrop extends StatefulWidget {
- const Backdrop({
- @required this.frontLayer,
- @required this.backLayer,
- @required this.frontTitle,
- @required this.backTitle,
- @required this.controller,
- }) : assert(frontLayer != null),
- assert(backLayer != null),
- assert(frontTitle != null),
- assert(backTitle != null),
- assert(controller != null);
-
- final Widget frontLayer;
- final Widget backLayer;
- final Widget frontTitle;
- final Widget backTitle;
- final AnimationController controller;
-
- @override
- _BackdropState createState() => _BackdropState();
-}
-
-class _BackdropState extends State<Backdrop> with SingleTickerProviderStateMixin {
- final GlobalKey _backdropKey = GlobalKey(debugLabel: 'Backdrop');
- AnimationController _controller;
- Animation<RelativeRect> _layerAnimation;
-
- @override
- void initState() {
- super.initState();
- _controller = widget.controller;
- }
-
- @override
- void dispose() {
- _controller.dispose();
- super.dispose();
- }
-
- bool get _frontLayerVisible {
- final AnimationStatus status = _controller.status;
- return status == AnimationStatus.completed || status == AnimationStatus.forward;
- }
-
- void _toggleBackdropLayerVisibility() {
- // Call setState here to update layerAnimation if that's necessary
- setState(() {
- _frontLayerVisible ? _controller.reverse() : _controller.forward();
- });
- }
-
- // _layerAnimation animates the front layer between open and close.
- // _getLayerAnimation adjusts the values in the TweenSequence so the
- // curve and timing are correct in both directions.
- Animation<RelativeRect> _getLayerAnimation(Size layerSize, double layerTop) {
- Curve firstCurve; // Curve for first TweenSequenceItem
- Curve secondCurve; // Curve for second TweenSequenceItem
- double firstWeight; // Weight of first TweenSequenceItem
- double secondWeight; // Weight of second TweenSequenceItem
- Animation<double> animation; // Animation on which TweenSequence runs
-
- if (_frontLayerVisible) {
- firstCurve = _kAccelerateCurve;
- secondCurve = _kDecelerateCurve;
- firstWeight = _kPeakVelocityTime;
- secondWeight = 1.0 - _kPeakVelocityTime;
- animation = CurvedAnimation(
- parent: _controller.view,
- curve: const Interval(0.0, 0.78),
- );
- } else {
- // These values are only used when the controller runs from t=1.0 to t=0.0
- firstCurve = _kDecelerateCurve.flipped;
- secondCurve = _kAccelerateCurve.flipped;
- firstWeight = 1.0 - _kPeakVelocityTime;
- secondWeight = _kPeakVelocityTime;
- animation = _controller.view;
- }
-
- return TweenSequence<RelativeRect>(
- <TweenSequenceItem<RelativeRect>>[
- TweenSequenceItem<RelativeRect>(
- tween: RelativeRectTween(
- begin: RelativeRect.fromLTRB(
- 0.0,
- layerTop,
- 0.0,
- layerTop - layerSize.height,
- ),
- end: RelativeRect.fromLTRB(
- 0.0,
- layerTop * _kPeakVelocityProgress,
- 0.0,
- (layerTop - layerSize.height) * _kPeakVelocityProgress,
- ),
- ).chain(CurveTween(curve: firstCurve)),
- weight: firstWeight,
- ),
- TweenSequenceItem<RelativeRect>(
- tween: RelativeRectTween(
- begin: RelativeRect.fromLTRB(
- 0.0,
- layerTop * _kPeakVelocityProgress,
- 0.0,
- (layerTop - layerSize.height) * _kPeakVelocityProgress,
- ),
- end: RelativeRect.fill,
- ).chain(CurveTween(curve: secondCurve)),
- weight: secondWeight,
- ),
- ],
- ).animate(animation);
- }
-
- Widget _buildStack(BuildContext context, BoxConstraints constraints) {
- const double layerTitleHeight = 48.0;
- final Size layerSize = constraints.biggest;
- final double layerTop = layerSize.height - layerTitleHeight;
-
- _layerAnimation = _getLayerAnimation(layerSize, layerTop);
-
- return Stack(
- key: _backdropKey,
- children: <Widget>[
- widget.backLayer,
- PositionedTransition(
- rect: _layerAnimation,
- child: _FrontLayer(
- onTap: _toggleBackdropLayerVisibility,
- child: widget.frontLayer,
- ),
- ),
- ],
- );
- }
-
- @override
- Widget build(BuildContext context) {
- final AppBar appBar = AppBar(
- brightness: Brightness.light,
- elevation: 0.0,
- titleSpacing: 0.0,
- title: _BackdropTitle(
- listenable: _controller.view,
- onPress: _toggleBackdropLayerVisibility,
- frontTitle: widget.frontTitle,
- backTitle: widget.backTitle,
- ),
- actions: <Widget>[
- IconButton(
- icon: const Icon(Icons.search, semanticLabel: 'login'),
- onPressed: () {
- Navigator.push<void>(
- context,
- MaterialPageRoute<void>(builder: (BuildContext context) => LoginPage()),
- );
- },
- ),
- IconButton(
- icon: const Icon(Icons.tune, semanticLabel: 'login'),
- onPressed: () {
- Navigator.push<void>(
- context,
- MaterialPageRoute<void>(builder: (BuildContext context) => LoginPage()),
- );
- },
- ),
- ],
- );
- return Scaffold(
- appBar: appBar,
- body: LayoutBuilder(
- builder: _buildStack,
- ),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/category_menu_page.dart b/examples/flutter_gallery/lib/demo/shrine/category_menu_page.dart
deleted file mode 100644
index 1ac62d5..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/category_menu_page.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/colors.dart';
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-
-class CategoryMenuPage extends StatelessWidget {
- const CategoryMenuPage({
- Key key,
- this.onCategoryTap,
- }) : super(key: key);
-
- final VoidCallback onCategoryTap;
-
- Widget _buildCategory(Category category, BuildContext context) {
- final String categoryString = category.toString().replaceAll('Category.', '').toUpperCase();
- final ThemeData theme = Theme.of(context);
- return ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) =>
- GestureDetector(
- onTap: () {
- model.setCategory(category);
- if (onCategoryTap != null) {
- onCategoryTap();
- }
- },
- child: model.selectedCategory == category
- ? Column(
- children: <Widget>[
- const SizedBox(height: 16.0),
- Text(
- categoryString,
- style: theme.textTheme.body2,
- textAlign: TextAlign.center,
- ),
- const SizedBox(height: 14.0),
- Container(
- width: 70.0,
- height: 2.0,
- color: kShrinePink400,
- ),
- ],
- )
- : Padding(
- padding: const EdgeInsets.symmetric(vertical: 16.0),
- child: Text(
- categoryString,
- style: theme.textTheme.body2.copyWith(
- color: kShrineBrown900.withAlpha(153)
- ),
- textAlign: TextAlign.center,
- ),
- ),
- ),
- );
- }
-
- @override
- Widget build(BuildContext context) {
- return Center(
- child: Container(
- padding: const EdgeInsets.only(top: 40.0),
- color: kShrinePink100,
- child: ListView(
- children: Category.values.map((Category c) => _buildCategory(c, context)).toList(),
- ),
- ),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/colors.dart b/examples/flutter_gallery/lib/demo/shrine/colors.dart
deleted file mode 100644
index 66a4728..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/colors.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-
-const Color kShrinePink50 = Color(0xFFFEEAE6);
-const Color kShrinePink100 = Color(0xFFFEDBD0);
-const Color kShrinePink300 = Color(0xFFFBB8AC);
-const Color kShrinePink400 = Color(0xFFEAA4A4);
-
-const Color kShrineBrown900 = Color(0xFF442B2D);
-const Color kShrineBrown600 = Color(0xFF7D4F52);
-
-const Color kShrineErrorRed = Color(0xFFC5032B);
-
-const Color kShrineSurfaceWhite = Color(0xFFFFFBFA);
-const Color kShrineBackgroundWhite = Colors.white;
diff --git a/examples/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart b/examples/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart
deleted file mode 100644
index b74d632..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/expanding_bottom_sheet.dart
+++ /dev/null
@@ -1,655 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:async';
-
-import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
-import 'package:meta/meta.dart';
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/colors.dart';
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-import 'package:flutter_gallery/demo/shrine/shopping_cart.dart';
-
-// These curves define the emphasized easing curve.
-const Cubic _kAccelerateCurve = Cubic(0.548, 0.0, 0.757, 0.464);
-const Cubic _kDecelerateCurve = Cubic(0.23, 0.94, 0.41, 1.0);
-// The time at which the accelerate and decelerate curves switch off
-const double _kPeakVelocityTime = 0.248210;
-// Percent (as a decimal) of animation that should be completed at _peakVelocityTime
-const double _kPeakVelocityProgress = 0.379146;
-const double _kCartHeight = 56.0;
-// Radius of the shape on the top left of the sheet.
-const double _kCornerRadius = 24.0;
-// Width for just the cart icon and no thumbnails.
-const double _kWidthForCartIcon = 64.0;
-
-class ExpandingBottomSheet extends StatefulWidget {
- const ExpandingBottomSheet({Key key, @required this.hideController})
- : assert(hideController != null),
- super(key: key);
-
- final AnimationController hideController;
-
- @override
- _ExpandingBottomSheetState createState() => _ExpandingBottomSheetState();
-
- static _ExpandingBottomSheetState of(BuildContext context, {bool isNullOk = false}) {
- assert(isNullOk != null);
- assert(context != null);
- final _ExpandingBottomSheetState result = context.ancestorStateOfType(
- const TypeMatcher<_ExpandingBottomSheetState>()
- );
- if (isNullOk || result != null) {
- return result;
- }
- throw FlutterError(
- 'ExpandingBottomSheet.of() called with a context that does not contain a ExpandingBottomSheet.\n');
- }
-}
-
-// Emphasized Easing is a motion curve that has an organic, exciting feeling.
-// It's very fast to begin with and then very slow to finish. Unlike standard
-// curves, like [Curves.fastOutSlowIn], it can't be expressed in a cubic bezier
-// curve formula. It's quintic, not cubic. But it _can_ be expressed as one
-// curve followed by another, which we do here.
-Animation<T> _getEmphasizedEasingAnimation<T>({
- @required T begin,
- @required T peak,
- @required T end,
- @required bool isForward,
- @required Animation<double> parent}) {
- Curve firstCurve;
- Curve secondCurve;
- double firstWeight;
- double secondWeight;
-
- if (isForward) {
- firstCurve = _kAccelerateCurve;
- secondCurve = _kDecelerateCurve;
- firstWeight = _kPeakVelocityTime;
- secondWeight = 1.0 - _kPeakVelocityTime;
- } else {
- firstCurve = _kDecelerateCurve.flipped;
- secondCurve = _kAccelerateCurve.flipped;
- firstWeight = 1.0 - _kPeakVelocityTime;
- secondWeight = _kPeakVelocityTime;
- }
-
- return TweenSequence<T>(
- <TweenSequenceItem<T>>[
- TweenSequenceItem<T>(
- weight: firstWeight,
- tween: Tween<T>(
- begin: begin,
- end: peak,
- ).chain(CurveTween(curve: firstCurve)),
- ),
- TweenSequenceItem<T>(
- weight: secondWeight,
- tween: Tween<T>(
- begin: peak,
- end: end,
- ).chain(CurveTween(curve: secondCurve)),
- ),
- ],
- ).animate(parent);
-}
-
-// Calculates the value where two double Animations should be joined. Used by
-// callers of _getEmphasisedEasing<double>().
-double _getPeakPoint({double begin, double end}) {
- return begin + (end - begin) * _kPeakVelocityProgress;
-}
-
-class _ExpandingBottomSheetState extends State<ExpandingBottomSheet> with TickerProviderStateMixin {
- final GlobalKey _expandingBottomSheetKey = GlobalKey(debugLabel: 'Expanding bottom sheet');
-
- // The width of the Material, calculated by _widthFor() & based on the number
- // of products in the cart. 64.0 is the width when there are 0 products
- // (_kWidthForZeroProducts)
- double _width = _kWidthForCartIcon;
-
- // Controller for the opening and closing of the ExpandingBottomSheet
- AnimationController _controller;
-
- // Animations for the opening and closing of the ExpandingBottomSheet
- Animation<double> _widthAnimation;
- Animation<double> _heightAnimation;
- Animation<double> _thumbnailOpacityAnimation;
- Animation<double> _cartOpacityAnimation;
- Animation<double> _shapeAnimation;
- Animation<Offset> _slideAnimation;
-
- @override
- void initState() {
- super.initState();
- _controller = AnimationController(
- duration: const Duration(milliseconds: 500),
- vsync: this,
- );
- }
-
- @override
- void dispose() {
- _controller.dispose();
- super.dispose();
- }
-
- Animation<double> _getWidthAnimation(double screenWidth) {
- if (_controller.status == AnimationStatus.forward) {
- // Opening animation
- return Tween<double>(begin: _width, end: screenWidth).animate(
- CurvedAnimation(
- parent: _controller.view,
- curve: const Interval(0.0, 0.3, curve: Curves.fastOutSlowIn),
- ),
- );
- } else {
- // Closing animation
- return _getEmphasizedEasingAnimation(
- begin: _width,
- peak: _getPeakPoint(begin: _width, end: screenWidth),
- end: screenWidth,
- isForward: false,
- parent: CurvedAnimation(parent: _controller.view, curve: const Interval(0.0, 0.87)),
- );
- }
- }
-
- Animation<double> _getHeightAnimation(double screenHeight) {
- if (_controller.status == AnimationStatus.forward) {
- // Opening animation
-
- return _getEmphasizedEasingAnimation(
- begin: _kCartHeight,
- peak: _kCartHeight + (screenHeight - _kCartHeight) * _kPeakVelocityProgress,
- end: screenHeight,
- isForward: true,
- parent: _controller.view,
- );
- } else {
- // Closing animation
- return Tween<double>(
- begin: _kCartHeight,
- end: screenHeight,
- ).animate(
- CurvedAnimation(
- parent: _controller.view,
- curve: const Interval(0.434, 1.0, curve: Curves.linear), // not used
- // only the reverseCurve will be used
- reverseCurve: Interval(0.434, 1.0, curve: Curves.fastOutSlowIn.flipped),
- ),
- );
- }
- }
-
- // Animation of the cut corner. It's cut when closed and not cut when open.
- Animation<double> _getShapeAnimation() {
- if (_controller.status == AnimationStatus.forward) {
- return Tween<double>(begin: _kCornerRadius, end: 0.0).animate(
- CurvedAnimation(
- parent: _controller.view,
- curve: const Interval(0.0, 0.3, curve: Curves.fastOutSlowIn),
- ),
- );
- } else {
- return _getEmphasizedEasingAnimation(
- begin: _kCornerRadius,
- peak: _getPeakPoint(begin: _kCornerRadius, end: 0.0),
- end: 0.0,
- isForward: false,
- parent: _controller.view,
- );
- }
- }
-
- Animation<double> _getThumbnailOpacityAnimation() {
- return Tween<double>(begin: 1.0, end: 0.0).animate(
- CurvedAnimation(
- parent: _controller.view,
- curve: _controller.status == AnimationStatus.forward
- ? const Interval(0.0, 0.3)
- : const Interval(0.532, 0.766),
- ),
- );
- }
-
- Animation<double> _getCartOpacityAnimation() {
- return CurvedAnimation(
- parent: _controller.view,
- curve: _controller.status == AnimationStatus.forward
- ? const Interval(0.3, 0.6)
- : const Interval(0.766, 1.0),
- );
- }
-
- // Returns the correct width of the ExpandingBottomSheet based on the number of
- // products in the cart.
- double _widthFor(int numProducts) {
- switch (numProducts) {
- case 0:
- return _kWidthForCartIcon;
- case 1:
- return 136.0;
- case 2:
- return 192.0;
- case 3:
- return 248.0;
- default:
- return 278.0;
- }
- }
-
- // Returns true if the cart is open or opening and false otherwise.
- bool get _isOpen {
- final AnimationStatus status = _controller.status;
- return status == AnimationStatus.completed || status == AnimationStatus.forward;
- }
-
- // Opens the ExpandingBottomSheet if it's closed, otherwise does nothing.
- void open() {
- if (!_isOpen) {
- _controller.forward();
- }
- }
-
- // Closes the ExpandingBottomSheet if it's open or opening, otherwise does nothing.
- void close() {
- if (_isOpen) {
- _controller.reverse();
- }
- }
-
- // Changes the padding between the start edge of the Material and the cart icon
- // based on the number of products in the cart (padding increases when > 0
- // products.)
- EdgeInsetsDirectional _cartPaddingFor(int numProducts) {
- return (numProducts == 0)
- ? const EdgeInsetsDirectional.only(start: 20.0, end: 8.0)
- : const EdgeInsetsDirectional.only(start: 32.0, end: 8.0);
- }
-
- bool get _cartIsVisible => _thumbnailOpacityAnimation.value == 0.0;
-
- Widget _buildThumbnails(int numProducts) {
- return ExcludeSemantics(
- child: Opacity(
- opacity: _thumbnailOpacityAnimation.value,
- child: Column(
- children: <Widget>[
- Row(
- children: <Widget>[
- AnimatedPadding(
- padding: _cartPaddingFor(numProducts),
- child: const Icon(Icons.shopping_cart),
- duration: const Duration(milliseconds: 225),
- ),
- Container(
- // Accounts for the overflow number
- width: numProducts > 3 ? _width - 94.0 : _width - 64.0,
- height: _kCartHeight,
- padding: const EdgeInsets.symmetric(vertical: 8.0),
- child: ProductThumbnailRow(),
- ),
- ExtraProductsNumber(),
- ],
- ),
- ],
- ),
- ),
- );
- }
-
- Widget _buildShoppingCartPage() {
- return Opacity(
- opacity: _cartOpacityAnimation.value,
- child: ShoppingCartPage(),
- );
- }
-
- Widget _buildCart(BuildContext context, Widget child) {
- // numProducts is the number of different products in the cart (does not
- // include multiples of the same product).
- final AppStateModel model = ScopedModel.of<AppStateModel>(context);
- final int numProducts = model.productsInCart.keys.length;
- final int totalCartQuantity = model.totalCartQuantity;
- final Size screenSize = MediaQuery.of(context).size;
- final double screenWidth = screenSize.width;
- final double screenHeight = screenSize.height;
-
- _width = _widthFor(numProducts);
- _widthAnimation = _getWidthAnimation(screenWidth);
- _heightAnimation = _getHeightAnimation(screenHeight);
- _shapeAnimation = _getShapeAnimation();
- _thumbnailOpacityAnimation = _getThumbnailOpacityAnimation();
- _cartOpacityAnimation = _getCartOpacityAnimation();
-
- return Semantics(
- button: true,
- value: 'Shopping cart, $totalCartQuantity items',
- child: Container(
- width: _widthAnimation.value,
- height: _heightAnimation.value,
- child: Material(
- animationDuration: const Duration(milliseconds: 0),
- shape: BeveledRectangleBorder(
- borderRadius: BorderRadius.only(
- topLeft: Radius.circular(_shapeAnimation.value),
- ),
- ),
- elevation: 4.0,
- color: kShrinePink50,
- child: _cartIsVisible
- ? _buildShoppingCartPage()
- : _buildThumbnails(numProducts),
- ),
- ),
- );
- }
-
- // Builder for the hide and reveal animation when the backdrop opens and closes
- Widget _buildSlideAnimation(BuildContext context, Widget child) {
- _slideAnimation = _getEmphasizedEasingAnimation(
- begin: const Offset(1.0, 0.0),
- peak: const Offset(_kPeakVelocityProgress, 0.0),
- end: const Offset(0.0, 0.0),
- isForward: widget.hideController.status == AnimationStatus.forward,
- parent: widget.hideController,
- );
-
- return SlideTransition(
- position: _slideAnimation,
- child: child,
- );
- }
-
- // Closes the cart if the cart is open, otherwise exits the app (this should
- // only be relevant for Android).
- Future<bool> _onWillPop() async {
- if (!_isOpen) {
- await SystemNavigator.pop();
- return true;
- }
-
- close();
- return true;
- }
-
- @override
- Widget build(BuildContext context) {
- return AnimatedSize(
- key: _expandingBottomSheetKey,
- duration: const Duration(milliseconds: 225),
- curve: Curves.easeInOut,
- vsync: this,
- alignment: FractionalOffset.topLeft,
- child: WillPopScope(
- onWillPop: _onWillPop,
- child: AnimatedBuilder(
- animation: widget.hideController,
- builder: _buildSlideAnimation,
- child: GestureDetector(
- behavior: HitTestBehavior.opaque,
- onTap: open,
- child: ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) {
- return AnimatedBuilder(
- builder: _buildCart,
- animation: _controller,
- );
- },
- ),
- ),
- ),
- ),
- );
- }
-}
-
-class ProductThumbnailRow extends StatefulWidget {
- @override
- _ProductThumbnailRowState createState() => _ProductThumbnailRowState();
-}
-
-class _ProductThumbnailRowState extends State<ProductThumbnailRow> {
- final GlobalKey<AnimatedListState> _listKey = GlobalKey<AnimatedListState>();
-
- // _list represents what's currently on screen. If _internalList updates,
- // it will need to be updated to match it.
- _ListModel _list;
-
- // _internalList represents the list as it is updated by the AppStateModel.
- List<int> _internalList;
-
- @override
- void initState() {
- super.initState();
- _list = _ListModel(
- listKey: _listKey,
- initialItems: ScopedModel.of<AppStateModel>(context).productsInCart.keys.toList(),
- removedItemBuilder: _buildRemovedThumbnail,
- );
- _internalList = List<int>.from(_list.list);
- }
-
- Product _productWithId(int productId) {
- final AppStateModel model = ScopedModel.of<AppStateModel>(context);
- final Product product = model.getProductById(productId);
- assert(product != null);
- return product;
- }
-
- Widget _buildRemovedThumbnail(int item, BuildContext context, Animation<double> animation) {
- return ProductThumbnail(animation, animation, _productWithId(item));
- }
-
- Widget _buildThumbnail(BuildContext context, int index, Animation<double> animation) {
- final Animation<double> thumbnailSize = Tween<double>(begin: 0.8, end: 1.0).animate(
- CurvedAnimation(
- curve: const Interval(0.33, 1.0, curve: Curves.easeIn),
- parent: animation,
- ),
- );
-
- final Animation<double> opacity = CurvedAnimation(
- curve: const Interval(0.33, 1.0, curve: Curves.linear),
- parent: animation,
- );
-
- return ProductThumbnail(thumbnailSize, opacity, _productWithId(_list[index]));
- }
-
- // If the lists are the same length, assume nothing has changed.
- // If the internalList is shorter than the ListModel, an item has been removed.
- // If the internalList is longer, then an item has been added.
- void _updateLists() {
- // Update _internalList based on the model
- _internalList = ScopedModel.of<AppStateModel>(context).productsInCart.keys.toList();
- final Set<int> internalSet = Set<int>.from(_internalList);
- final Set<int> listSet = Set<int>.from(_list.list);
-
- final Set<int> difference = internalSet.difference(listSet);
- if (difference.isEmpty) {
- return;
- }
-
- for (int product in difference) {
- if (_internalList.length < _list.length) {
- _list.remove(product);
- } else if (_internalList.length > _list.length) {
- _list.add(product);
- }
- }
-
- while (_internalList.length != _list.length) {
- int index = 0;
- // Check bounds and that the list elements are the same
- while (_internalList.isNotEmpty &&
- _list.length > 0 &&
- index < _internalList.length &&
- index < _list.length &&
- _internalList[index] == _list[index]) {
- index++;
- }
- }
- }
-
- Widget _buildAnimatedList() {
- return AnimatedList(
- key: _listKey,
- shrinkWrap: true,
- itemBuilder: _buildThumbnail,
- initialItemCount: _list.length,
- scrollDirection: Axis.horizontal,
- physics: const NeverScrollableScrollPhysics(), // Cart shouldn't scroll
- );
- }
-
- @override
- Widget build(BuildContext context) {
- _updateLists();
- return ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) => _buildAnimatedList(),
- );
- }
-}
-
-class ExtraProductsNumber extends StatelessWidget {
- // Calculates the number to be displayed at the end of the row if there are
- // more than three products in the cart. This calculates overflow products,
- // including their duplicates (but not duplicates of products shown as
- // thumbnails).
- int _calculateOverflow(AppStateModel model) {
- final Map<int, int> productMap = model.productsInCart;
- // List created to be able to access products by index instead of ID.
- // Order is guaranteed because productsInCart returns a LinkedHashMap.
- final List<int> products = productMap.keys.toList();
- int overflow = 0;
- final int numProducts = products.length;
- if (numProducts > 3) {
- for (int i = 3; i < numProducts; i++) {
- overflow += productMap[products[i]];
- }
- }
- return overflow;
- }
-
- Widget _buildOverflow(AppStateModel model, BuildContext context) {
- if (model.productsInCart.length <= 3)
- return Container();
-
- final int numOverflowProducts = _calculateOverflow(model);
- // Maximum of 99 so padding doesn't get messy.
- final int displayedOverflowProducts = numOverflowProducts <= 99 ? numOverflowProducts : 99;
- return Container(
- child: Text(
- '+$displayedOverflowProducts',
- style: Theme.of(context).primaryTextTheme.button,
- ),
- );
- }
-
- @override
- Widget build(BuildContext context) {
- return ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext builder, Widget child, AppStateModel model) => _buildOverflow(model, context),
- );
- }
-}
-
-class ProductThumbnail extends StatelessWidget {
- const ProductThumbnail(this.animation, this.opacityAnimation, this.product);
-
- final Animation<double> animation;
- final Animation<double> opacityAnimation;
- final Product product;
-
- @override
- Widget build(BuildContext context) {
- return FadeTransition(
- opacity: opacityAnimation,
- child: ScaleTransition(
- scale: animation,
- child: Container(
- width: 40.0,
- height: 40.0,
- decoration: BoxDecoration(
- image: DecorationImage(
- image: ExactAssetImage(
- product.assetName, // asset name
- package: product.assetPackage, // asset package
- ),
- fit: BoxFit.cover,
- ),
- borderRadius: const BorderRadius.all(Radius.circular(10.0)),
- ),
- margin: const EdgeInsets.only(left: 16.0),
- ),
- ),
- );
- }
-}
-
-// _ListModel manipulates an internal list and an AnimatedList
-class _ListModel {
- _ListModel({
- @required this.listKey,
- @required this.removedItemBuilder,
- Iterable<int> initialItems
- }) : assert(listKey != null),
- assert(removedItemBuilder != null),
- _items = List<int>.from(initialItems ?? <int>[]);
-
- final GlobalKey<AnimatedListState> listKey;
- final dynamic removedItemBuilder;
- final List<int> _items;
-
- AnimatedListState get _animatedList => listKey.currentState;
-
- void add(int product) {
- _insert(_items.length, product);
- }
-
- void _insert(int index, int item) {
- _items.insert(index, item);
- _animatedList.insertItem(index, duration: const Duration(milliseconds: 225));
- }
-
- void remove(int product) {
- final int index = _items.indexOf(product);
- if (index >= 0) {
- _removeAt(index);
- }
- }
-
- void _removeAt(int index) {
- final int removedItem = _items.removeAt(index);
- if (removedItem != null) {
- _animatedList.removeItem(index, (BuildContext context, Animation<double> animation) {
- return removedItemBuilder(removedItem, context, animation);
- });
- }
- }
-
- int get length => _items.length;
-
- int operator [](int index) => _items[index];
-
- int indexOf(int item) => _items.indexOf(item);
-
- List<int> get list => _items;
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/home.dart b/examples/flutter_gallery/lib/demo/shrine/home.dart
deleted file mode 100644
index 33131e2..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/home.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/backdrop.dart';
-import 'package:flutter_gallery/demo/shrine/expanding_bottom_sheet.dart';
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-import 'package:flutter_gallery/demo/shrine/supplemental/asymmetric_view.dart';
-
-class ProductPage extends StatelessWidget {
- const ProductPage({this.category = Category.all});
-
- final Category category;
-
- @override
- Widget build(BuildContext context) {
- return ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) {
- return AsymmetricView(products: model.getProducts());
- });
- }
-}
-
-class HomePage extends StatelessWidget {
- const HomePage({
- this.expandingBottomSheet,
- this.backdrop,
- Key key,
- }) : super(key: key);
-
- final ExpandingBottomSheet expandingBottomSheet;
- final Backdrop backdrop;
-
- @override
- Widget build(BuildContext context) {
- return Stack(
- children: <Widget>[
- backdrop,
- Align(child: expandingBottomSheet, alignment: Alignment.bottomRight)
- ],
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/login.dart b/examples/flutter_gallery/lib/demo/shrine/login.dart
deleted file mode 100644
index c400755..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/login.dart
+++ /dev/null
@@ -1,126 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-
-import 'package:flutter_gallery/demo/shrine/colors.dart';
-
-class LoginPage extends StatefulWidget {
- @override
- _LoginPageState createState() => _LoginPageState();
-}
-
-class _LoginPageState extends State<LoginPage> {
- final TextEditingController _usernameController = TextEditingController();
- final TextEditingController _passwordController = TextEditingController();
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: SafeArea(
- child: ListView(
- padding: const EdgeInsets.symmetric(horizontal: 24.0),
- children: <Widget>[
- const SizedBox(height: 80.0),
- Column(
- children: <Widget>[
- Image.asset('packages/shrine_images/diamond.png'),
- const SizedBox(height: 16.0),
- Text(
- 'SHRINE',
- style: Theme.of(context).textTheme.headline,
- ),
- ],
- ),
- const SizedBox(height: 120.0),
- PrimaryColorOverride(
- color: kShrineBrown900,
- child: TextField(
- controller: _usernameController,
- decoration: const InputDecoration(
- labelText: 'Username',
- ),
- ),
- ),
- const SizedBox(height: 12.0),
- PrimaryColorOverride(
- color: kShrineBrown900,
- child: TextField(
- controller: _passwordController,
- decoration: const InputDecoration(
- labelText: 'Password',
- ),
- ),
- ),
- Wrap(
- children: <Widget>[
- ButtonBar(
- children: <Widget>[
- FlatButton(
- child: const Text('CANCEL'),
- shape: const BeveledRectangleBorder(
- borderRadius: BorderRadius.all(Radius.circular(7.0)),
- ),
- onPressed: () {
- _usernameController.clear();
- _passwordController.clear();
- },
- ),
- RaisedButton(
- child: const Text('NEXT'),
- elevation: 8.0,
- shape: const BeveledRectangleBorder(
- borderRadius: BorderRadius.all(Radius.circular(7.0)),
- ),
- onPressed: () {
- Navigator.pop(context);
- },
- ),
- ],
- ),
- Tooltip(
- message: 'Back',
- child: FlatButton(
- child: const Text('EXIT'),
- shape: const BeveledRectangleBorder(
- borderRadius: BorderRadius.all(Radius.circular(7.0)),
- ),
- onPressed: () {
- Navigator.of(context, rootNavigator: true).pop();
- },
- ),
- ),
- ],
- ),
- ],
- ),
- ),
- );
- }
-}
-
-class PrimaryColorOverride extends StatelessWidget {
- const PrimaryColorOverride({Key key, this.color, this.child}) : super(key: key);
-
- final Color color;
- final Widget child;
-
- @override
- Widget build(BuildContext context) {
- return Theme(
- child: child,
- data: Theme.of(context).copyWith(primaryColor: color),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/model/app_state_model.dart b/examples/flutter_gallery/lib/demo/shrine/model/app_state_model.dart
deleted file mode 100644
index 9c98465..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/model/app_state_model.dart
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-import 'package:flutter_gallery/demo/shrine/model/products_repository.dart';
-
-double _salesTaxRate = 0.06;
-double _shippingCostPerItem = 7.0;
-
-class AppStateModel extends Model {
- // All the available products.
- List<Product> _availableProducts;
-
- // The currently selected category of products.
- Category _selectedCategory = Category.all;
-
- // The IDs and quantities of products currently in the cart.
- final Map<int, int> _productsInCart = <int, int>{};
-
- Map<int, int> get productsInCart => Map<int, int>.from(_productsInCart);
-
- // Total number of items in the cart.
- int get totalCartQuantity => _productsInCart.values.fold(0, (int v, int e) => v + e);
-
- Category get selectedCategory => _selectedCategory;
-
- // Totaled prices of the items in the cart.
- double get subtotalCost {
- return _productsInCart.keys
- .map((int id) => _availableProducts[id].price * _productsInCart[id])
- .fold(0.0, (double sum, int e) => sum + e);
- }
-
- // Total shipping cost for the items in the cart.
- double get shippingCost {
- return _shippingCostPerItem * _productsInCart.values.fold(0.0, (num sum, int e) => sum + e);
- }
-
- // Sales tax for the items in the cart
- double get tax => subtotalCost * _salesTaxRate;
-
- // Total cost to order everything in the cart.
- double get totalCost => subtotalCost + shippingCost + tax;
-
- // Returns a copy of the list of available products, filtered by category.
- List<Product> getProducts() {
- if (_availableProducts == null) {
- return <Product>[];
- }
-
- if (_selectedCategory == Category.all) {
- return List<Product>.from(_availableProducts);
- } else {
- return _availableProducts
- .where((Product p) => p.category == _selectedCategory)
- .toList();
- }
- }
-
- // Adds a product to the cart.
- void addProductToCart(int productId) {
- if (!_productsInCart.containsKey(productId)) {
- _productsInCart[productId] = 1;
- } else {
- _productsInCart[productId]++;
- }
-
- notifyListeners();
- }
-
- // Removes an item from the cart.
- void removeItemFromCart(int productId) {
- if (_productsInCart.containsKey(productId)) {
- if (_productsInCart[productId] == 1) {
- _productsInCart.remove(productId);
- } else {
- _productsInCart[productId]--;
- }
- }
-
- notifyListeners();
- }
-
- // Returns the Product instance matching the provided id.
- Product getProductById(int id) {
- return _availableProducts.firstWhere((Product p) => p.id == id);
- }
-
- // Removes everything from the cart.
- void clearCart() {
- _productsInCart.clear();
- notifyListeners();
- }
-
- // Loads the list of available products from the repo.
- void loadProducts() {
- _availableProducts = ProductsRepository.loadProducts(Category.all);
- notifyListeners();
- }
-
- void setCategory(Category newCategory) {
- _selectedCategory = newCategory;
- notifyListeners();
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/model/product.dart b/examples/flutter_gallery/lib/demo/shrine/model/product.dart
deleted file mode 100644
index ffedcc3..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/model/product.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/foundation.dart';
-
-enum Category {
- all,
- accessories,
- clothing,
- home,
-}
-
-class Product {
- const Product({
- @required this.category,
- @required this.id,
- @required this.isFeatured,
- @required this.name,
- @required this.price,
- }) : assert(category != null),
- assert(id != null),
- assert(isFeatured != null),
- assert(name != null),
- assert(price != null);
-
- final Category category;
- final int id;
- final bool isFeatured;
- final String name;
- final int price;
-
- String get assetName => '$id-0.jpg';
- String get assetPackage => 'shrine_images';
-
- @override
- String toString() => '$name (id=$id)';
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/model/products_repository.dart b/examples/flutter_gallery/lib/demo/shrine/model/products_repository.dart
deleted file mode 100644
index 75bf4b3..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/model/products_repository.dart
+++ /dev/null
@@ -1,293 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-
-class ProductsRepository {
- static List<Product> loadProducts(Category category) {
- const List<Product> allProducts = <Product>[
- Product(
- category: Category.accessories,
- id: 0,
- isFeatured: true,
- name: 'Vagabond sack',
- price: 120,
- ),
- Product(
- category: Category.accessories,
- id: 1,
- isFeatured: true,
- name: 'Stella sunglasses',
- price: 58,
- ),
- Product(
- category: Category.accessories,
- id: 2,
- isFeatured: false,
- name: 'Whitney belt',
- price: 35,
- ),
- Product(
- category: Category.accessories,
- id: 3,
- isFeatured: true,
- name: 'Garden strand',
- price: 98,
- ),
- Product(
- category: Category.accessories,
- id: 4,
- isFeatured: false,
- name: 'Strut earrings',
- price: 34,
- ),
- Product(
- category: Category.accessories,
- id: 5,
- isFeatured: false,
- name: 'Varsity socks',
- price: 12,
- ),
- Product(
- category: Category.accessories,
- id: 6,
- isFeatured: false,
- name: 'Weave keyring',
- price: 16,
- ),
- Product(
- category: Category.accessories,
- id: 7,
- isFeatured: true,
- name: 'Gatsby hat',
- price: 40,
- ),
- Product(
- category: Category.accessories,
- id: 8,
- isFeatured: true,
- name: 'Shrug bag',
- price: 198,
- ),
- Product(
- category: Category.home,
- id: 9,
- isFeatured: true,
- name: 'Gilt desk trio',
- price: 58,
- ),
- Product(
- category: Category.home,
- id: 10,
- isFeatured: false,
- name: 'Copper wire rack',
- price: 18,
- ),
- Product(
- category: Category.home,
- id: 11,
- isFeatured: false,
- name: 'Soothe ceramic set',
- price: 28,
- ),
- Product(
- category: Category.home,
- id: 12,
- isFeatured: false,
- name: 'Hurrahs tea set',
- price: 34,
- ),
- Product(
- category: Category.home,
- id: 13,
- isFeatured: true,
- name: 'Blue stone mug',
- price: 18,
- ),
- Product(
- category: Category.home,
- id: 14,
- isFeatured: true,
- name: 'Rainwater tray',
- price: 27,
- ),
- Product(
- category: Category.home,
- id: 15,
- isFeatured: true,
- name: 'Chambray napkins',
- price: 16,
- ),
- Product(
- category: Category.home,
- id: 16,
- isFeatured: true,
- name: 'Succulent planters',
- price: 16,
- ),
- Product(
- category: Category.home,
- id: 17,
- isFeatured: false,
- name: 'Quartet table',
- price: 175,
- ),
- Product(
- category: Category.home,
- id: 18,
- isFeatured: true,
- name: 'Kitchen quattro',
- price: 129,
- ),
- Product(
- category: Category.clothing,
- id: 19,
- isFeatured: false,
- name: 'Clay sweater',
- price: 48,
- ),
- Product(
- category: Category.clothing,
- id: 20,
- isFeatured: false,
- name: 'Sea tunic',
- price: 45,
- ),
- Product(
- category: Category.clothing,
- id: 21,
- isFeatured: false,
- name: 'Plaster tunic',
- price: 38,
- ),
- Product(
- category: Category.clothing,
- id: 22,
- isFeatured: false,
- name: 'White pinstripe shirt',
- price: 70,
- ),
- Product(
- category: Category.clothing,
- id: 23,
- isFeatured: false,
- name: 'Chambray shirt',
- price: 70,
- ),
- Product(
- category: Category.clothing,
- id: 24,
- isFeatured: true,
- name: 'Seabreeze sweater',
- price: 60,
- ),
- Product(
- category: Category.clothing,
- id: 25,
- isFeatured: false,
- name: 'Gentry jacket',
- price: 178,
- ),
- Product(
- category: Category.clothing,
- id: 26,
- isFeatured: false,
- name: 'Navy trousers',
- price: 74,
- ),
- Product(
- category: Category.clothing,
- id: 27,
- isFeatured: true,
- name: 'Walter henley (white)',
- price: 38,
- ),
- Product(
- category: Category.clothing,
- id: 28,
- isFeatured: true,
- name: 'Surf and perf shirt',
- price: 48,
- ),
- Product(
- category: Category.clothing,
- id: 29,
- isFeatured: true,
- name: 'Ginger scarf',
- price: 98,
- ),
- Product(
- category: Category.clothing,
- id: 30,
- isFeatured: true,
- name: 'Ramona crossover',
- price: 68,
- ),
- Product(
- category: Category.clothing,
- id: 31,
- isFeatured: false,
- name: 'Chambray shirt',
- price: 38,
- ),
- Product(
- category: Category.clothing,
- id: 32,
- isFeatured: false,
- name: 'Classic white collar',
- price: 58,
- ),
- Product(
- category: Category.clothing,
- id: 33,
- isFeatured: true,
- name: 'Cerise scallop tee',
- price: 42,
- ),
- Product(
- category: Category.clothing,
- id: 34,
- isFeatured: false,
- name: 'Shoulder rolls tee',
- price: 27,
- ),
- Product(
- category: Category.clothing,
- id: 35,
- isFeatured: false,
- name: 'Grey slouch tank',
- price: 24,
- ),
- Product(
- category: Category.clothing,
- id: 36,
- isFeatured: false,
- name: 'Sunshirt dress',
- price: 58,
- ),
- Product(
- category: Category.clothing,
- id: 37,
- isFeatured: true,
- name: 'Fine lines tee',
- price: 58,
- ),
- ];
- if (category == Category.all) {
- return allProducts;
- } else {
- return allProducts.where((Product p) => p.category == category).toList();
- }
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shopping_cart.dart b/examples/flutter_gallery/lib/demo/shrine/shopping_cart.dart
deleted file mode 100644
index 076e657..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/shopping_cart.dart
+++ /dev/null
@@ -1,275 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-import 'package:intl/intl.dart';
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/colors.dart';
-import 'package:flutter_gallery/demo/shrine/expanding_bottom_sheet.dart';
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-
-const double _leftColumnWidth = 60.0;
-
-class ShoppingCartPage extends StatefulWidget {
- @override
- _ShoppingCartPageState createState() => _ShoppingCartPageState();
-}
-
-class _ShoppingCartPageState extends State<ShoppingCartPage> {
- List<Widget> _createShoppingCartRows(AppStateModel model) {
- return model.productsInCart.keys
- .map((int id) => ShoppingCartRow(
- product: model.getProductById(id),
- quantity: model.productsInCart[id],
- onPressed: () {
- model.removeItemFromCart(id);
- },
- ),
- )
- .toList();
- }
-
- @override
- Widget build(BuildContext context) {
- final ThemeData localTheme = Theme.of(context);
-
- return Scaffold(
- backgroundColor: kShrinePink50,
- body: SafeArea(
- child: Container(
- child: ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) {
- return Stack(
- children: <Widget>[
- ListView(
- children: <Widget>[
- Row(
- children: <Widget>[
- SizedBox(
- width: _leftColumnWidth,
- child: IconButton(
- icon: const Icon(Icons.keyboard_arrow_down),
- onPressed: () => ExpandingBottomSheet.of(context).close(),
- ),
- ),
- Text(
- 'CART',
- style: localTheme.textTheme.subhead.copyWith(fontWeight: FontWeight.w600),
- ),
- const SizedBox(width: 16.0),
- Text('${model.totalCartQuantity} ITEMS'),
- ],
- ),
- const SizedBox(height: 16.0),
- Column(
- children: _createShoppingCartRows(model),
- ),
- ShoppingCartSummary(model: model),
- const SizedBox(height: 100.0),
- ],
- ),
- Positioned(
- bottom: 16.0,
- left: 16.0,
- right: 16.0,
- child: RaisedButton(
- shape: const BeveledRectangleBorder(
- borderRadius: BorderRadius.all(Radius.circular(7.0)),
- ),
- color: kShrinePink100,
- splashColor: kShrineBrown600,
- child: const Padding(
- padding: EdgeInsets.symmetric(vertical: 12.0),
- child: Text('CLEAR CART'),
- ),
- onPressed: () {
- model.clearCart();
- ExpandingBottomSheet.of(context).close();
- },
- ),
- ),
- ],
- );
- },
- ),
- ),
- ),
- );
- }
-}
-
-class ShoppingCartSummary extends StatelessWidget {
- const ShoppingCartSummary({this.model});
-
- final AppStateModel model;
-
- @override
- Widget build(BuildContext context) {
- final TextStyle smallAmountStyle = Theme.of(context).textTheme.body1.copyWith(color: kShrineBrown600);
- final TextStyle largeAmountStyle = Theme.of(context).textTheme.display1;
- final NumberFormat formatter = NumberFormat.simpleCurrency(
- decimalDigits: 2,
- locale: Localizations.localeOf(context).toString(),
- );
-
- return Row(
- children: <Widget>[
- const SizedBox(width: _leftColumnWidth),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.only(right: 16.0),
- child: Column(
- children: <Widget>[
- Row(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: <Widget>[
- const Expanded(
- child: Text('TOTAL'),
- ),
- Text(
- formatter.format(model.totalCost),
- style: largeAmountStyle,
- ),
- ],
- ),
- const SizedBox(height: 16.0),
- Row(
- children: <Widget>[
- const Expanded(
- child: Text('Subtotal:'),
- ),
- Text(
- formatter.format(model.subtotalCost),
- style: smallAmountStyle,
- ),
- ],
- ),
- const SizedBox(height: 4.0),
- Row(
- children: <Widget>[
- const Expanded(
- child: Text('Shipping:'),
- ),
- Text(
- formatter.format(model.shippingCost),
- style: smallAmountStyle,
- ),
- ],
- ),
- const SizedBox(height: 4.0),
- Row(
- children: <Widget>[
- const Expanded(
- child: Text('Tax:'),
- ),
- Text(
- formatter.format(model.tax),
- style: smallAmountStyle,
- ),
- ],
- ),
- ],
- ),
- ),
- ),
- ],
- );
- }
-}
-
-class ShoppingCartRow extends StatelessWidget {
- const ShoppingCartRow({
- @required this.product,
- @required this.quantity,
- this.onPressed,
- });
-
- final Product product;
- final int quantity;
- final VoidCallback onPressed;
-
- @override
- Widget build(BuildContext context) {
- final NumberFormat formatter = NumberFormat.simpleCurrency(
- decimalDigits: 0,
- locale: Localizations.localeOf(context).toString(),
- );
- final ThemeData localTheme = Theme.of(context);
-
- return Padding(
- padding: const EdgeInsets.only(bottom: 16.0),
- child: Row(
- key: ValueKey<int>(product.id),
- crossAxisAlignment: CrossAxisAlignment.start,
- children: <Widget>[
- SizedBox(
- width: _leftColumnWidth,
- child: IconButton(
- icon: const Icon(Icons.remove_circle_outline),
- onPressed: onPressed,
- ),
- ),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.only(right: 16.0),
- child: Column(
- children: <Widget>[
- Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: <Widget>[
- Image.asset(
- product.assetName,
- package: product.assetPackage,
- fit: BoxFit.cover,
- width: 75.0,
- height: 75.0,
- ),
- const SizedBox(width: 16.0),
- Expanded(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: <Widget>[
- Row(
- children: <Widget>[
- Expanded(
- child: Text('Quantity: $quantity'),
- ),
- Text('x ${formatter.format(product.price)}'),
- ],
- ),
- Text(
- product.name,
- style: localTheme.textTheme.subhead.copyWith(fontWeight: FontWeight.w600),
- ),
- ],
- ),
- ),
- ],
- ),
- const SizedBox(height: 16.0),
- const Divider(
- color: kShrineBrown900,
- height: 10.0,
- ),
- ],
- ),
- ),
- ),
- ],
- ),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_data.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_data.dart
new file mode 100644
index 0000000..85dcce3
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_data.dart
@@ -0,0 +1,278 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'shrine_types.dart';
+
+const String _kGalleryAssetsPackage = 'flutter_gallery_assets';
+
+const Vendor _ali = Vendor(
+ name: 'Ali’s shop',
+ avatarAsset: 'people/square/ali.png',
+ avatarAssetPackage: _kGalleryAssetsPackage,
+ description:
+ 'Ali Connor’s makes custom goods for folks of all shapes and sizes '
+ 'made by hand and sometimes by machine, but always with love and care. '
+ 'Custom orders are available upon request if you need something extra special.'
+);
+
+const Vendor _peter = Vendor(
+ name: 'Peter’s shop',
+ avatarAsset: 'people/square/peter.png',
+ avatarAssetPackage: _kGalleryAssetsPackage,
+ description:
+ 'Peter makes great stuff for awesome people like you. Super cool and extra '
+ 'awesome all of his shop’s goods are handmade with love. Custom orders are '
+ 'available upon request if you need something extra special.'
+);
+
+const Vendor _sandra = Vendor(
+ name: 'Sandra’s shop',
+ avatarAsset: 'people/square/sandra.png',
+ avatarAssetPackage: _kGalleryAssetsPackage,
+ description:
+ 'Sandra specializes in furniture, beauty and travel products with a classic vibe. '
+ 'Custom orders are available if you’re looking for a certain color or material.'
+);
+
+const Vendor _stella = Vendor(
+ name: 'Stella’s shop',
+ avatarAsset: 'people/square/stella.png',
+ avatarAssetPackage: _kGalleryAssetsPackage,
+ description:
+ 'Stella sells awesome stuff at lovely prices. made by hand and sometimes by '
+ 'machine, but always with love and care. Custom orders are available upon request '
+ 'if you need something extra special.'
+);
+
+const Vendor _trevor = Vendor(
+ name: 'Trevor’s shop',
+ avatarAsset: 'people/square/trevor.png',
+ avatarAssetPackage: _kGalleryAssetsPackage,
+ description:
+ 'Trevor makes great stuff for awesome people like you. Super cool and extra '
+ 'awesome all of his shop’s goods are handmade with love. Custom orders are '
+ 'available upon request if you need something extra special.'
+);
+
+const List<Product> _allProducts = <Product> [
+ Product(
+ name: 'Vintage Brown Belt',
+ imageAsset: 'products/belt.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion', 'latest'],
+ price: 300.00,
+ vendor: _sandra,
+ description:
+ 'Isn’t it cool when things look old, but they\'re not. Looks Old But Not makes '
+ 'awesome vintage goods that are super smart. This ol’ belt just got an upgrade. '
+ ),
+ Product(
+ name: 'Sunglasses',
+ imageAsset: 'products/sunnies.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'fashion', 'beauty'],
+ price: 20.00,
+ vendor: _trevor,
+ description:
+ 'Be an optimist. Carry Sunglasses with you at all times. All Tints and '
+ 'Shades products come with polarized lenses and super duper UV protection '
+ 'so you can look at the sun for however long you want. Sunglasses make you '
+ 'look cool, wear them.'
+ ),
+ Product(
+ name: 'Flatwear',
+ imageAsset: 'products/flatwear.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['furniture'],
+ price: 30.00,
+ vendor: _trevor,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Salmon Sweater',
+ imageAsset: 'products/sweater.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion'],
+ price: 300.00,
+ vendor: _stella,
+ description:
+ 'Looks can be deceiving. This sweater comes in a wide variety of '
+ 'flavors, including salmon, that pop as soon as they hit your eyes. '
+ 'Sweaters heat quickly, so savor the warmth.'
+ ),
+ Product(
+ name: 'Pine Table',
+ imageAsset: 'products/table.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['furniture'],
+ price: 63.00,
+ vendor: _stella,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Green Comfort Jacket',
+ imageAsset: 'products/jacket.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion'],
+ price: 36.00,
+ vendor: _ali,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Chambray Top',
+ imageAsset: 'products/top.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion'],
+ price: 125.00,
+ vendor: _peter,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Blue Cup',
+ imageAsset: 'products/cup.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'furniture'],
+ price: 75.00,
+ vendor: _sandra,
+ description:
+ 'Drinksy has been making extraordinary mugs for decades. With each '
+ 'cup purchased Drinksy donates a cup to those in need. Buy yourself a mug, '
+ 'buy someone else a mug.'
+ ),
+ Product(
+ name: 'Tea Set',
+ imageAsset: 'products/teaset.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['furniture', 'fashion'],
+ price: 70.00,
+ vendor: _trevor,
+ featureTitle: 'Beautiful glass teapot',
+ featureDescription:
+ 'Teapot holds extremely hot liquids and pours them from the spout.',
+ description:
+ 'Impress your guests with Tea Set by Kitchen Stuff. Teapot holds extremely '
+ 'hot liquids and pours them from the spout. Use the handle, shown on the right, '
+ 'so your fingers don’t get burnt while pouring.'
+ ),
+ Product(
+ name: 'Blue linen napkins',
+ imageAsset: 'products/napkins.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['furniture', 'fashion'],
+ price: 89.00,
+ vendor: _trevor,
+ description:
+ 'Blue linen napkins were meant to go with friends, so you may want to pick '
+ 'up a bunch of these. These things are absorbant.'
+ ),
+ Product(
+ name: 'Dipped Earrings',
+ imageAsset: 'products/earrings.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion', 'beauty'],
+ price: 25.00,
+ vendor: _stella,
+ description:
+ 'WeDipIt does it again. These hand-dipped 4 inch earrings are perfect for '
+ 'the office or the beach. Just be sure you don’t drop it in a bucket of '
+ 'red paint, then they won’t look dipped anymore.'
+ ),
+ Product(
+ name: 'Perfect Planters',
+ imageAsset: 'products/planters.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['latest', 'furniture'],
+ price: 30.00,
+ vendor: _ali,
+ description:
+ 'The Perfect Planter Co makes the best vessels for just about anything you '
+ 'can pot. This set of Perfect Planters holds succulents and cuttings perfectly. '
+ 'Looks great in any room. Keep out of reach from cats.'
+ ),
+ Product(
+ name: 'Cloud-White Dress',
+ imageAsset: 'products/dress.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['fashion'],
+ price: 54.00,
+ vendor: _sandra,
+ description:
+ 'Trying to find the perfect outift to match your mood? Try no longer. '
+ 'This Cloud-White Dress has you covered for those nights when you need '
+ 'to get out, or even if you’re just headed to work.'
+ ),
+ Product(
+ name: 'Backpack',
+ imageAsset: 'products/backpack.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'fashion'],
+ price: 25.00,
+ vendor: _peter,
+ description:
+ 'This backpack by Bags ‘n’ stuff can hold just about anything: a laptop, '
+ 'a pen, a protractor, notebooks, small animals, plugs for your devices, '
+ 'sunglasses, gym clothes, shoes, gloves, two kittens, and even lunch!'
+ ),
+ Product(
+ name: 'Charcoal Straw Hat',
+ imageAsset: 'products/hat.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'fashion', 'latest'],
+ price: 25.00,
+ vendor: _ali,
+ description:
+ 'This is the helmet for those warm summer days on the road. '
+ 'Jetset approved, these hats have been rigorously tested. Keep that face '
+ 'protected from the sun.'
+ ),
+ Product(
+ name: 'Ginger Scarf',
+ imageAsset: 'products/scarf.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['latest', 'fashion'],
+ price: 17.00,
+ vendor: _peter,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Blush Sweats',
+ imageAsset: 'products/sweats.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'fashion', 'latest'],
+ price: 25.00,
+ vendor: _stella,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Mint Jumper',
+ imageAsset: 'products/jumper.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>['travel', 'fashion', 'beauty'],
+ price: 25.00,
+ vendor: _peter,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ ),
+ Product(
+ name: 'Ochre Shirt',
+ imageAsset: 'products/shirt.png',
+ imageAssetPackage: _kGalleryAssetsPackage,
+ categories: <String>[ 'fashion', 'latest'],
+ price: 120.00,
+ vendor: _stella,
+ description:
+ 'Leave the tunnel and the rain is fallin amazing things happen when you wait'
+ )
+];
+
+List<Product> allProducts() {
+ assert(_allProducts.every((Product product) => product.isValid()));
+ return List<Product>.unmodifiable(_allProducts);
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart
new file mode 100644
index 0000000..a7aa943
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_home.dart
@@ -0,0 +1,411 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/rendering.dart';
+import 'package:meta/meta.dart';
+
+import 'shrine_data.dart';
+import 'shrine_order.dart';
+import 'shrine_page.dart';
+import 'shrine_theme.dart';
+import 'shrine_types.dart';
+
+const double unitSize = kToolbarHeight;
+
+final List<Product> _products = List<Product>.from(allProducts());
+final Map<Product, Order> _shoppingCart = <Product, Order>{};
+
+const int _childrenPerBlock = 8;
+const int _rowsPerBlock = 5;
+
+int _minIndexInRow(int rowIndex) {
+ final int blockIndex = rowIndex ~/ _rowsPerBlock;
+ return const <int>[0, 2, 4, 6, 7][rowIndex % _rowsPerBlock] + blockIndex * _childrenPerBlock;
+}
+
+int _maxIndexInRow(int rowIndex) {
+ final int blockIndex = rowIndex ~/ _rowsPerBlock;
+ return const <int>[1, 3, 5, 6, 7][rowIndex % _rowsPerBlock] + blockIndex * _childrenPerBlock;
+}
+
+int _rowAtIndex(int index) {
+ final int blockCount = index ~/ _childrenPerBlock;
+ return const <int>[0, 0, 1, 1, 2, 2, 3, 4][index - blockCount * _childrenPerBlock] + blockCount * _rowsPerBlock;
+}
+
+int _columnAtIndex(int index) {
+ return const <int>[0, 1, 0, 1, 0, 1, 0, 0][index % _childrenPerBlock];
+}
+
+int _columnSpanAtIndex(int index) {
+ return const <int>[1, 1, 1, 1, 1, 1, 2, 2][index % _childrenPerBlock];
+}
+
+// The Shrine home page arranges the product cards into two columns. The card
+// on every 4th and 5th row spans two columns.
+class _ShrineGridLayout extends SliverGridLayout {
+ const _ShrineGridLayout({
+ @required this.rowStride,
+ @required this.columnStride,
+ @required this.tileHeight,
+ @required this.tileWidth,
+ });
+
+ final double rowStride;
+ final double columnStride;
+ final double tileHeight;
+ final double tileWidth;
+
+ @override
+ int getMinChildIndexForScrollOffset(double scrollOffset) {
+ return _minIndexInRow(scrollOffset ~/ rowStride);
+ }
+
+ @override
+ int getMaxChildIndexForScrollOffset(double scrollOffset) {
+ return _maxIndexInRow(scrollOffset ~/ rowStride);
+ }
+
+ @override
+ SliverGridGeometry getGeometryForChildIndex(int index) {
+ final int row = _rowAtIndex(index);
+ final int column = _columnAtIndex(index);
+ final int columnSpan = _columnSpanAtIndex(index);
+ return SliverGridGeometry(
+ scrollOffset: row * rowStride,
+ crossAxisOffset: column * columnStride,
+ mainAxisExtent: tileHeight,
+ crossAxisExtent: tileWidth + (columnSpan - 1) * columnStride,
+ );
+ }
+
+ @override
+ double computeMaxScrollOffset(int childCount) {
+ if (childCount == 0)
+ return 0.0;
+ final int rowCount = _rowAtIndex(childCount - 1) + 1;
+ final double rowSpacing = rowStride - tileHeight;
+ return rowStride * rowCount - rowSpacing;
+ }
+}
+
+class _ShrineGridDelegate extends SliverGridDelegate {
+ static const double _spacing = 8.0;
+
+ @override
+ SliverGridLayout getLayout(SliverConstraints constraints) {
+ final double tileWidth = (constraints.crossAxisExtent - _spacing) / 2.0;
+ const double tileHeight = 40.0 + 144.0 + 40.0;
+ return _ShrineGridLayout(
+ tileWidth: tileWidth,
+ tileHeight: tileHeight,
+ rowStride: tileHeight + _spacing,
+ columnStride: tileWidth + _spacing,
+ );
+ }
+
+ @override
+ bool shouldRelayout(covariant SliverGridDelegate oldDelegate) => false;
+}
+
+// Displays the Vendor's name and avatar.
+class _VendorItem extends StatelessWidget {
+ const _VendorItem({ Key key, @required this.vendor })
+ : assert(vendor != null),
+ super(key: key);
+
+ final Vendor vendor;
+
+ @override
+ Widget build(BuildContext context) {
+ return SizedBox(
+ height: 24.0,
+ child: Row(
+ children: <Widget>[
+ SizedBox(
+ width: 24.0,
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(12.0),
+ child: Image.asset(
+ vendor.avatarAsset,
+ package: vendor.avatarAssetPackage,
+ fit: BoxFit.cover,
+ ),
+ ),
+ ),
+ const SizedBox(width: 8.0),
+ Expanded(
+ child: Text(vendor.name, style: ShrineTheme.of(context).vendorItemStyle),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
+// Displays the product's price. If the product is in the shopping cart then the
+// background is highlighted.
+abstract class _PriceItem extends StatelessWidget {
+ const _PriceItem({ Key key, @required this.product })
+ : assert(product != null),
+ super(key: key);
+
+ final Product product;
+
+ Widget buildItem(BuildContext context, TextStyle style, EdgeInsets padding) {
+ BoxDecoration decoration;
+ if (_shoppingCart[product] != null)
+ decoration = BoxDecoration(color: ShrineTheme.of(context).priceHighlightColor);
+
+ return Container(
+ padding: padding,
+ decoration: decoration,
+ child: Text(product.priceString, style: style),
+ );
+ }
+}
+
+class _ProductPriceItem extends _PriceItem {
+ const _ProductPriceItem({ Key key, Product product }) : super(key: key, product: product);
+
+ @override
+ Widget build(BuildContext context) {
+ return buildItem(
+ context,
+ ShrineTheme.of(context).priceStyle,
+ const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
+ );
+ }
+}
+
+class _FeaturePriceItem extends _PriceItem {
+ const _FeaturePriceItem({ Key key, Product product }) : super(key: key, product: product);
+
+ @override
+ Widget build(BuildContext context) {
+ return buildItem(
+ context,
+ ShrineTheme.of(context).featurePriceStyle,
+ const EdgeInsets.symmetric(horizontal: 24.0, vertical: 16.0),
+ );
+ }
+}
+
+class _HeadingLayout extends MultiChildLayoutDelegate {
+ _HeadingLayout();
+
+ static const String price = 'price';
+ static const String image = 'image';
+ static const String title = 'title';
+ static const String description = 'description';
+ static const String vendor = 'vendor';
+
+ @override
+ void performLayout(Size size) {
+ final Size priceSize = layoutChild(price, BoxConstraints.loose(size));
+ positionChild(price, Offset(size.width - priceSize.width, 0.0));
+
+ final double halfWidth = size.width / 2.0;
+ final double halfHeight = size.height / 2.0;
+ const double halfUnit = unitSize / 2.0;
+ const double margin = 16.0;
+
+ final Size imageSize = layoutChild(image, BoxConstraints.loose(size));
+ final double imageX = imageSize.width < halfWidth - halfUnit
+ ? halfWidth / 2.0 - imageSize.width / 2.0 - halfUnit
+ : halfWidth - imageSize.width;
+ positionChild(image, Offset(imageX, halfHeight - imageSize.height / 2.0));
+
+ final double maxTitleWidth = halfWidth + unitSize - margin;
+ final BoxConstraints titleBoxConstraints = BoxConstraints(maxWidth: maxTitleWidth);
+ final Size titleSize = layoutChild(title, titleBoxConstraints);
+ final double titleX = halfWidth - unitSize;
+ final double titleY = halfHeight - titleSize.height;
+ positionChild(title, Offset(titleX, titleY));
+
+ final Size descriptionSize = layoutChild(description, titleBoxConstraints);
+ final double descriptionY = titleY + titleSize.height + margin;
+ positionChild(description, Offset(titleX, descriptionY));
+
+ layoutChild(vendor, titleBoxConstraints);
+ final double vendorY = descriptionY + descriptionSize.height + margin;
+ positionChild(vendor, Offset(titleX, vendorY));
+ }
+
+ @override
+ bool shouldRelayout(_HeadingLayout oldDelegate) => false;
+}
+
+// A card that highlights the "featured" catalog item.
+class _Heading extends StatelessWidget {
+ _Heading({ Key key, @required this.product })
+ : assert(product != null),
+ assert(product.featureTitle != null),
+ assert(product.featureDescription != null),
+ super(key: key);
+
+ final Product product;
+
+ @override
+ Widget build(BuildContext context) {
+ final Size screenSize = MediaQuery.of(context).size;
+ final ShrineTheme theme = ShrineTheme.of(context);
+ return MergeSemantics(
+ child: SizedBox(
+ height: screenSize.width > screenSize.height
+ ? (screenSize.height - kToolbarHeight) * 0.85
+ : (screenSize.height - kToolbarHeight) * 0.70,
+ child: Container(
+ decoration: BoxDecoration(
+ color: theme.cardBackgroundColor,
+ border: Border(bottom: BorderSide(color: theme.dividerColor)),
+ ),
+ child: CustomMultiChildLayout(
+ delegate: _HeadingLayout(),
+ children: <Widget>[
+ LayoutId(
+ id: _HeadingLayout.price,
+ child: _FeaturePriceItem(product: product),
+ ),
+ LayoutId(
+ id: _HeadingLayout.image,
+ child: Image.asset(
+ product.imageAsset,
+ package: product.imageAssetPackage,
+ fit: BoxFit.cover,
+ ),
+ ),
+ LayoutId(
+ id: _HeadingLayout.title,
+ child: Text(product.featureTitle, style: theme.featureTitleStyle),
+ ),
+ LayoutId(
+ id: _HeadingLayout.description,
+ child: Text(product.featureDescription, style: theme.featureStyle),
+ ),
+ LayoutId(
+ id: _HeadingLayout.vendor,
+ child: _VendorItem(vendor: product.vendor),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
+
+// A card that displays a product's image, price, and vendor. The _ProductItem
+// cards appear in a grid below the heading.
+class _ProductItem extends StatelessWidget {
+ const _ProductItem({ Key key, @required this.product, this.onPressed })
+ : assert(product != null),
+ super(key: key);
+
+ final Product product;
+ final VoidCallback onPressed;
+
+ @override
+ Widget build(BuildContext context) {
+ return MergeSemantics(
+ child: Card(
+ child: Stack(
+ children: <Widget>[
+ Column(
+ children: <Widget>[
+ Align(
+ alignment: Alignment.centerRight,
+ child: _ProductPriceItem(product: product),
+ ),
+ Container(
+ width: 144.0,
+ height: 144.0,
+ padding: const EdgeInsets.symmetric(horizontal: 8.0),
+ child: Hero(
+ tag: product.tag,
+ child: Image.asset(
+ product.imageAsset,
+ package: product.imageAssetPackage,
+ fit: BoxFit.contain,
+ ),
+ ),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 8.0),
+ child: _VendorItem(vendor: product.vendor),
+ ),
+ ],
+ ),
+ Material(
+ type: MaterialType.transparency,
+ child: InkWell(onTap: onPressed),
+ ),
+ ],
+ ),
+ ),
+ );
+ }
+}
+
+// The Shrine app's home page. Displays the featured item above a grid
+// of the product items.
+class ShrineHome extends StatefulWidget {
+ @override
+ _ShrineHomeState createState() => _ShrineHomeState();
+}
+
+class _ShrineHomeState extends State<ShrineHome> {
+ static final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(debugLabel: 'Shrine Home');
+ static final _ShrineGridDelegate gridDelegate = _ShrineGridDelegate();
+
+ Future<void> _showOrderPage(Product product) async {
+ final Order order = _shoppingCart[product] ?? Order(product: product);
+ final Order completedOrder = await Navigator.push(context, ShrineOrderRoute(
+ order: order,
+ builder: (BuildContext context) {
+ return OrderPage(
+ order: order,
+ products: _products,
+ shoppingCart: _shoppingCart,
+ );
+ }
+ ));
+ assert(completedOrder.product != null);
+ if (completedOrder.quantity == 0)
+ _shoppingCart.remove(completedOrder.product);
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final Product featured = _products.firstWhere((Product product) => product.featureDescription != null);
+ return ShrinePage(
+ scaffoldKey: _scaffoldKey,
+ products: _products,
+ shoppingCart: _shoppingCart,
+ body: CustomScrollView(
+ slivers: <Widget>[
+ SliverToBoxAdapter(child: _Heading(product: featured)),
+ SliverSafeArea(
+ top: false,
+ minimum: const EdgeInsets.all(16.0),
+ sliver: SliverGrid(
+ gridDelegate: gridDelegate,
+ delegate: SliverChildListDelegate(
+ _products.map<Widget>((Product product) {
+ return _ProductItem(
+ product: product,
+ onPressed: () { _showOrderPage(product); },
+ );
+ }).toList(),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_order.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_order.dart
new file mode 100644
index 0000000..135f1c9
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_order.dart
@@ -0,0 +1,340 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import '../shrine_demo.dart' show ShrinePageRoute;
+import 'shrine_page.dart';
+import 'shrine_theme.dart';
+import 'shrine_types.dart';
+
+// Displays the product title's, description, and order quantity dropdown.
+class _ProductItem extends StatelessWidget {
+ const _ProductItem({
+ Key key,
+ @required this.product,
+ @required this.quantity,
+ @required this.onChanged,
+ }) : assert(product != null),
+ assert(quantity != null),
+ assert(onChanged != null),
+ super(key: key);
+
+ final Product product;
+ final int quantity;
+ final ValueChanged<int> onChanged;
+
+ @override
+ Widget build(BuildContext context) {
+ final ShrineTheme theme = ShrineTheme.of(context);
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: <Widget>[
+ Text(product.name, style: theme.featureTitleStyle),
+ const SizedBox(height: 24.0),
+ Text(product.description, style: theme.featureStyle),
+ const SizedBox(height: 16.0),
+ Padding(
+ padding: const EdgeInsets.only(top: 8.0, bottom: 8.0, right: 88.0),
+ child: DropdownButtonHideUnderline(
+ child: Container(
+ decoration: BoxDecoration(
+ border: Border.all(
+ color: const Color(0xFFD9D9D9),
+ ),
+ ),
+ child: DropdownButton<int>(
+ items: <int>[0, 1, 2, 3, 4, 5].map<DropdownMenuItem<int>>((int value) {
+ return DropdownMenuItem<int>(
+ value: value,
+ child: Padding(
+ padding: const EdgeInsets.only(left: 8.0),
+ child: Text('Quantity $value', style: theme.quantityMenuStyle),
+ ),
+ );
+ }).toList(),
+ value: quantity,
+ onChanged: onChanged,
+ ),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+}
+
+// Vendor name and description
+class _VendorItem extends StatelessWidget {
+ const _VendorItem({ Key key, @required this.vendor })
+ : assert(vendor != null),
+ super(key: key);
+
+ final Vendor vendor;
+
+ @override
+ Widget build(BuildContext context) {
+ final ShrineTheme theme = ShrineTheme.of(context);
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: <Widget>[
+ SizedBox(
+ height: 24.0,
+ child: Align(
+ alignment: Alignment.bottomLeft,
+ child: Text(vendor.name, style: theme.vendorTitleStyle),
+ ),
+ ),
+ const SizedBox(height: 16.0),
+ Text(vendor.description, style: theme.vendorStyle),
+ ],
+ );
+ }
+}
+
+// Layout the order page's heading: the product's image, the
+// title/description/dropdown product item, and the vendor item.
+class _HeadingLayout extends MultiChildLayoutDelegate {
+ _HeadingLayout();
+
+ static const String image = 'image';
+ static const String icon = 'icon';
+ static const String product = 'product';
+ static const String vendor = 'vendor';
+
+ @override
+ void performLayout(Size size) {
+ const double margin = 56.0;
+ final bool landscape = size.width > size.height;
+ final double imageWidth = (landscape ? size.width / 2.0 : size.width) - margin * 2.0;
+ final BoxConstraints imageConstraints = BoxConstraints(maxHeight: 224.0, maxWidth: imageWidth);
+ final Size imageSize = layoutChild(image, imageConstraints);
+ const double imageY = 0.0;
+ positionChild(image, const Offset(margin, imageY));
+
+ final double productWidth = landscape ? size.width / 2.0 : size.width - margin;
+ final BoxConstraints productConstraints = BoxConstraints(maxWidth: productWidth);
+ final Size productSize = layoutChild(product, productConstraints);
+ final double productX = landscape ? size.width / 2.0 : margin;
+ final double productY = landscape ? 0.0 : imageY + imageSize.height + 16.0;
+ positionChild(product, Offset(productX, productY));
+
+ final Size iconSize = layoutChild(icon, BoxConstraints.loose(size));
+ positionChild(icon, Offset(productX - iconSize.width - 16.0, productY + 8.0));
+
+ final double vendorWidth = landscape ? size.width - margin : productWidth;
+ layoutChild(vendor, BoxConstraints(maxWidth: vendorWidth));
+ final double vendorX = landscape ? margin : productX;
+ final double vendorY = productY + productSize.height + 16.0;
+ positionChild(vendor, Offset(vendorX, vendorY));
+ }
+
+ @override
+ bool shouldRelayout(_HeadingLayout oldDelegate) => true;
+}
+
+// Describes a product and vendor in detail, supports specifying
+// a order quantity (0-5). Appears at the top of the OrderPage.
+class _Heading extends StatelessWidget {
+ const _Heading({
+ Key key,
+ @required this.product,
+ @required this.quantity,
+ this.quantityChanged,
+ }) : assert(product != null),
+ assert(quantity != null && quantity >= 0 && quantity <= 5),
+ super(key: key);
+
+ final Product product;
+ final int quantity;
+ final ValueChanged<int> quantityChanged;
+
+ @override
+ Widget build(BuildContext context) {
+ final Size screenSize = MediaQuery.of(context).size;
+ return SizedBox(
+ height: (screenSize.height - kToolbarHeight) * 1.35,
+ child: Material(
+ type: MaterialType.card,
+ elevation: 0.0,
+ child: Padding(
+ padding: const EdgeInsets.only(left: 16.0, top: 18.0, right: 16.0, bottom: 24.0),
+ child: CustomMultiChildLayout(
+ delegate: _HeadingLayout(),
+ children: <Widget>[
+ LayoutId(
+ id: _HeadingLayout.image,
+ child: Hero(
+ tag: product.tag,
+ child: Image.asset(
+ product.imageAsset,
+ package: product.imageAssetPackage,
+ fit: BoxFit.contain,
+ alignment: Alignment.center,
+ ),
+ ),
+ ),
+ LayoutId(
+ id: _HeadingLayout.icon,
+ child: const Icon(
+ Icons.info_outline,
+ size: 24.0,
+ color: Color(0xFFFFE0E0),
+ ),
+ ),
+ LayoutId(
+ id: _HeadingLayout.product,
+ child: _ProductItem(
+ product: product,
+ quantity: quantity,
+ onChanged: quantityChanged,
+ ),
+ ),
+ LayoutId(
+ id: _HeadingLayout.vendor,
+ child: _VendorItem(vendor: product.vendor),
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
+
+class OrderPage extends StatefulWidget {
+ OrderPage({
+ Key key,
+ @required this.order,
+ @required this.products,
+ @required this.shoppingCart,
+ }) : assert(order != null),
+ assert(products != null && products.isNotEmpty),
+ assert(shoppingCart != null),
+ super(key: key);
+
+ final Order order;
+ final List<Product> products;
+ final Map<Product, Order> shoppingCart;
+
+ @override
+ _OrderPageState createState() => _OrderPageState();
+}
+
+// Displays a product's heading above photos of all of the other products
+// arranged in two columns. Enables the user to specify a quantity and add an
+// order to the shopping cart.
+class _OrderPageState extends State<OrderPage> {
+ GlobalKey<ScaffoldState> scaffoldKey;
+
+ @override
+ void initState() {
+ super.initState();
+ scaffoldKey = GlobalKey<ScaffoldState>(debugLabel: 'Shrine Order ${widget.order}');
+ }
+
+ Order get currentOrder => ShrineOrderRoute.of(context).order;
+
+ set currentOrder(Order value) {
+ ShrineOrderRoute.of(context).order = value;
+ }
+
+ void updateOrder({ int quantity, bool inCart }) {
+ final Order newOrder = currentOrder.copyWith(quantity: quantity, inCart: inCart);
+ if (currentOrder != newOrder) {
+ setState(() {
+ widget.shoppingCart[newOrder.product] = newOrder;
+ currentOrder = newOrder;
+ });
+ }
+ }
+
+ void showSnackBarMessage(String message) {
+ scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(message)));
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return ShrinePage(
+ scaffoldKey: scaffoldKey,
+ products: widget.products,
+ shoppingCart: widget.shoppingCart,
+ floatingActionButton: FloatingActionButton(
+ onPressed: () {
+ updateOrder(inCart: true);
+ final int n = currentOrder.quantity;
+ final String item = currentOrder.product.name;
+ showSnackBarMessage(
+ 'There ${ n == 1 ? "is one $item item" : "are $n $item items" } in the shopping cart.'
+ );
+ },
+ backgroundColor: const Color(0xFF16F0F0),
+ tooltip: 'Add to cart',
+ child: const Icon(
+ Icons.add_shopping_cart,
+ color: Colors.black,
+ ),
+ ),
+ body: CustomScrollView(
+ slivers: <Widget>[
+ SliverToBoxAdapter(
+ child: _Heading(
+ product: widget.order.product,
+ quantity: currentOrder.quantity,
+ quantityChanged: (int value) { updateOrder(quantity: value); },
+ ),
+ ),
+ SliverSafeArea(
+ top: false,
+ minimum: const EdgeInsets.fromLTRB(8.0, 32.0, 8.0, 8.0),
+ sliver: SliverGrid(
+ gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
+ maxCrossAxisExtent: 248.0,
+ mainAxisSpacing: 8.0,
+ crossAxisSpacing: 8.0,
+ ),
+ delegate: SliverChildListDelegate(
+ widget.products
+ .where((Product product) => product != widget.order.product)
+ .map((Product product) {
+ return Card(
+ elevation: 1.0,
+ child: Image.asset(
+ product.imageAsset,
+ package: product.imageAssetPackage,
+ fit: BoxFit.contain,
+ ),
+ );
+ }).toList(),
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
+
+// Displays a full-screen modal OrderPage.
+//
+// The order field will be replaced each time the user reconfigures the order.
+// When the user backs out of this route the completer's value will be the
+// final value of the order field.
+class ShrineOrderRoute extends ShrinePageRoute<Order> {
+ ShrineOrderRoute({
+ @required this.order,
+ WidgetBuilder builder,
+ RouteSettings settings,
+ }) : assert(order != null),
+ super(builder: builder, settings: settings);
+
+ Order order;
+
+ @override
+ Order get currentResult => order;
+
+ static ShrineOrderRoute of(BuildContext context) => ModalRoute.of<Order>(context);
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_page.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_page.dart
new file mode 100644
index 0000000..b31cb3d
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_page.dart
@@ -0,0 +1,149 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import 'shrine_theme.dart';
+import 'shrine_types.dart';
+
+enum ShrineAction {
+ sortByPrice,
+ sortByProduct,
+ emptyCart
+}
+
+class ShrinePage extends StatefulWidget {
+ const ShrinePage({
+ Key key,
+ @required this.scaffoldKey,
+ @required this.body,
+ this.floatingActionButton,
+ this.products,
+ this.shoppingCart
+ }) : assert(body != null),
+ assert(scaffoldKey != null),
+ super(key: key);
+
+ final GlobalKey<ScaffoldState> scaffoldKey;
+ final Widget body;
+ final Widget floatingActionButton;
+ final List<Product> products;
+ final Map<Product, Order> shoppingCart;
+
+ @override
+ ShrinePageState createState() => ShrinePageState();
+}
+
+/// Defines the Scaffold, AppBar, etc that the demo pages have in common.
+class ShrinePageState extends State<ShrinePage> {
+ double _appBarElevation = 0.0;
+
+ bool _handleScrollNotification(ScrollNotification notification) {
+ final double elevation = notification.metrics.extentBefore <= 0.0 ? 0.0 : 1.0;
+ if (elevation != _appBarElevation) {
+ setState(() {
+ _appBarElevation = elevation;
+ });
+ }
+ return false;
+ }
+
+ void _showShoppingCart() {
+ showModalBottomSheet<void>(context: context, builder: (BuildContext context) {
+ if (widget.shoppingCart.isEmpty) {
+ return const Padding(
+ padding: EdgeInsets.all(24.0),
+ child: Text('The shopping cart is empty')
+ );
+ }
+ return ListView(
+ padding: kMaterialListPadding,
+ children: widget.shoppingCart.values.map((Order order) {
+ return ListTile(
+ title: Text(order.product.name),
+ leading: Text('${order.quantity}'),
+ subtitle: Text(order.product.vendor.name)
+ );
+ }).toList(),
+ );
+ });
+ }
+
+ void _sortByPrice() {
+ widget.products.sort((Product a, Product b) => a.price.compareTo(b.price));
+ }
+
+ void _sortByProduct() {
+ widget.products.sort((Product a, Product b) => a.name.compareTo(b.name));
+ }
+
+ void _emptyCart() {
+ widget.shoppingCart.clear();
+ widget.scaffoldKey.currentState.showSnackBar(const SnackBar(content: Text('Shopping cart is empty')));
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final ShrineTheme theme = ShrineTheme.of(context);
+ return Scaffold(
+ key: widget.scaffoldKey,
+ appBar: AppBar(
+ elevation: _appBarElevation,
+ backgroundColor: theme.appBarBackgroundColor,
+ iconTheme: Theme.of(context).iconTheme,
+ brightness: Brightness.light,
+ flexibleSpace: Container(
+ decoration: BoxDecoration(
+ border: Border(
+ bottom: BorderSide(color: theme.dividerColor)
+ )
+ )
+ ),
+ title: Text('SHRINE', style: ShrineTheme.of(context).appBarTitleStyle),
+ centerTitle: true,
+ actions: <Widget>[
+ IconButton(
+ icon: const Icon(Icons.shopping_cart),
+ tooltip: 'Shopping cart',
+ onPressed: _showShoppingCart
+ ),
+ PopupMenuButton<ShrineAction>(
+ itemBuilder: (BuildContext context) => <PopupMenuItem<ShrineAction>>[
+ const PopupMenuItem<ShrineAction>(
+ value: ShrineAction.sortByPrice,
+ child: Text('Sort by price')
+ ),
+ const PopupMenuItem<ShrineAction>(
+ value: ShrineAction.sortByProduct,
+ child: Text('Sort by product')
+ ),
+ const PopupMenuItem<ShrineAction>(
+ value: ShrineAction.emptyCart,
+ child: Text('Empty shopping cart')
+ )
+ ],
+ onSelected: (ShrineAction action) {
+ switch (action) {
+ case ShrineAction.sortByPrice:
+ setState(_sortByPrice);
+ break;
+ case ShrineAction.sortByProduct:
+ setState(_sortByProduct);
+ break;
+ case ShrineAction.emptyCart:
+ setState(_emptyCart);
+ break;
+ }
+ }
+ )
+ ]
+ ),
+ floatingActionButton: widget.floatingActionButton,
+ body: NotificationListener<ScrollNotification>(
+ onNotification: _handleScrollNotification,
+ child: widget.body
+ )
+ );
+ }
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_theme.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_theme.dart
new file mode 100644
index 0000000..8e14634
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_theme.dart
@@ -0,0 +1,54 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+class ShrineStyle extends TextStyle {
+ const ShrineStyle.roboto(double size, FontWeight weight, Color color)
+ : super(inherit: false, color: color, fontSize: size, fontWeight: weight, textBaseline: TextBaseline.alphabetic);
+
+ const ShrineStyle.abrilFatface(double size, FontWeight weight, Color color)
+ : super(inherit: false, color: color, fontFamily: 'AbrilFatface', fontSize: size, fontWeight: weight, textBaseline: TextBaseline.alphabetic);
+}
+
+TextStyle robotoRegular12(Color color) => ShrineStyle.roboto(12.0, FontWeight.w500, color);
+TextStyle robotoLight12(Color color) => ShrineStyle.roboto(12.0, FontWeight.w300, color);
+TextStyle robotoRegular14(Color color) => ShrineStyle.roboto(14.0, FontWeight.w500, color);
+TextStyle robotoMedium14(Color color) => ShrineStyle.roboto(14.0, FontWeight.w600, color);
+TextStyle robotoLight14(Color color) => ShrineStyle.roboto(14.0, FontWeight.w300, color);
+TextStyle robotoRegular16(Color color) => ShrineStyle.roboto(16.0, FontWeight.w500, color);
+TextStyle robotoRegular20(Color color) => ShrineStyle.roboto(20.0, FontWeight.w500, color);
+TextStyle abrilFatfaceRegular24(Color color) => ShrineStyle.abrilFatface(24.0, FontWeight.w500, color);
+TextStyle abrilFatfaceRegular34(Color color) => ShrineStyle.abrilFatface(34.0, FontWeight.w500, color);
+
+/// The TextStyles and Colors used for titles, labels, and descriptions. This
+/// InheritedWidget is shared by all of the routes and widgets created for
+/// the Shrine app.
+class ShrineTheme extends InheritedWidget {
+ ShrineTheme({ Key key, @required Widget child })
+ : assert(child != null),
+ super(key: key, child: child);
+
+ final Color cardBackgroundColor = Colors.white;
+ final Color appBarBackgroundColor = Colors.white;
+ final Color dividerColor = const Color(0xFFD9D9D9);
+ final Color priceHighlightColor = const Color(0xFFFFE0E0);
+
+ final TextStyle appBarTitleStyle = robotoRegular20(Colors.black87);
+ final TextStyle vendorItemStyle = robotoRegular12(const Color(0xFF81959D));
+ final TextStyle priceStyle = robotoRegular14(Colors.black87);
+ final TextStyle featureTitleStyle = abrilFatfaceRegular34(const Color(0xFF0A3142));
+ final TextStyle featurePriceStyle = robotoRegular16(Colors.black87);
+ final TextStyle featureStyle = robotoLight14(Colors.black54);
+ final TextStyle orderTitleStyle = abrilFatfaceRegular24(Colors.black87);
+ final TextStyle orderStyle = robotoLight14(Colors.black54);
+ final TextStyle vendorTitleStyle = robotoMedium14(Colors.black87);
+ final TextStyle vendorStyle = robotoLight14(Colors.black54);
+ final TextStyle quantityMenuStyle = robotoLight14(Colors.black54);
+
+ static ShrineTheme of(BuildContext context) => context.inheritFromWidgetOfExactType(ShrineTheme);
+
+ @override
+ bool updateShouldNotify(ShrineTheme oldWidget) => false;
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/shrine_types.dart b/examples/flutter_gallery/lib/demo/shrine/shrine_types.dart
new file mode 100644
index 0000000..884e646
--- /dev/null
+++ b/examples/flutter_gallery/lib/demo/shrine/shrine_types.dart
@@ -0,0 +1,107 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:ui' show hashValues;
+
+import 'package:flutter/foundation.dart';
+
+class Vendor {
+ const Vendor({
+ this.name,
+ this.description,
+ this.avatarAsset,
+ this.avatarAssetPackage,
+ });
+
+ final String name;
+ final String description;
+ final String avatarAsset;
+ final String avatarAssetPackage;
+
+ bool isValid() {
+ return name != null &&
+ description != null &&
+ avatarAsset != null;
+ }
+
+ @override
+ String toString() => 'Vendor($name)';
+}
+
+class Product {
+ const Product({
+ this.name,
+ this.description,
+ this.featureTitle,
+ this.featureDescription,
+ this.imageAsset,
+ this.imageAssetPackage,
+ this.categories,
+ this.price,
+ this.vendor
+ });
+
+ final String name;
+ final String description;
+ final String featureTitle;
+ final String featureDescription;
+ final String imageAsset;
+ final String imageAssetPackage;
+ final List<String> categories;
+ final double price;
+ final Vendor vendor;
+
+ String get tag => name; // Unique value for Heroes
+ String get priceString => '\$${price.floor()}';
+
+ bool isValid() {
+ return name != null &&
+ description != null &&
+ imageAsset != null &&
+ categories != null &&
+ categories.isNotEmpty &&
+ price != null &&
+ vendor.isValid();
+ }
+
+ @override
+ String toString() => 'Product($name)';
+}
+
+class Order {
+ Order({ @required this.product, this.quantity = 1, this.inCart = false })
+ : assert(product != null),
+ assert(quantity != null && quantity >= 0),
+ assert(inCart != null);
+
+ final Product product;
+ final int quantity;
+ final bool inCart;
+
+ Order copyWith({ Product product, int quantity, bool inCart }) {
+ return Order(
+ product: product ?? this.product,
+ quantity: quantity ?? this.quantity,
+ inCart: inCart ?? this.inCart
+ );
+ }
+
+ @override
+ bool operator ==(dynamic other) {
+ if (identical(this, other))
+ return true;
+ if (other.runtimeType != runtimeType)
+ return false;
+ final Order typedOther = other;
+ return product == typedOther.product &&
+ quantity == typedOther.quantity &&
+ inCart == typedOther.inCart;
+ }
+
+ @override
+ int get hashCode => hashValues(product, quantity, inCart);
+
+ @override
+ String toString() => 'Order($product, quantity=$quantity, inCart=$inCart)';
+}
diff --git a/examples/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart b/examples/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart
deleted file mode 100644
index 10922a1..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/supplemental/asymmetric_view.dart
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-import 'package:flutter_gallery/demo/shrine/supplemental/product_columns.dart';
-
-class AsymmetricView extends StatelessWidget {
- const AsymmetricView({Key key, this.products}) : super(key: key);
-
- final List<Product> products;
-
- List<Container> _buildColumns(BuildContext context) {
- if (products == null || products.isEmpty) {
- return const <Container>[];
- }
-
- // This will return a list of columns. It will oscillate between the two
- // kinds of columns. Even cases of the index (0, 2, 4, etc) will be
- // TwoProductCardColumn and the odd cases will be OneProductCardColumn.
- //
- // Each pair of columns will advance us 3 products forward (2 + 1). That's
- // some kinda awkward math so we use _evenCasesIndex and _oddCasesIndex as
- // helpers for creating the index of the product list that will correspond
- // to the index of the list of columns.
- return List<Container>.generate(_listItemCount(products.length), (int index) {
- double width = .59 * MediaQuery.of(context).size.width;
- Widget column;
- if (index % 2 == 0) {
- /// Even cases
- final int bottom = _evenCasesIndex(index);
- column = TwoProductCardColumn(
- bottom: products[bottom],
- top: products.length - 1 >= bottom + 1
- ? products[bottom + 1]
- : null,
- );
- width += 32.0;
- } else {
- /// Odd cases
- column = OneProductCardColumn(
- product: products[_oddCasesIndex(index)],
- );
- }
- return Container(
- width: width,
- child: Padding(
- padding: const EdgeInsets.symmetric(horizontal: 16.0),
- child: column,
- ),
- );
- }).toList();
- }
-
- int _evenCasesIndex(int input) {
- // The operator ~/ is a cool one. It's the truncating division operator. It
- // divides the number and if there's a remainder / decimal, it cuts it off.
- // This is like dividing and then casting the result to int. Also, it's
- // functionally equivalent to floor() in this case.
- return input ~/ 2 * 3;
- }
-
- int _oddCasesIndex(int input) {
- assert(input > 0);
- return (input / 2).ceil() * 3 - 1;
- }
-
- int _listItemCount(int totalItems) {
- return (totalItems % 3 == 0)
- ? totalItems ~/ 3 * 2
- : (totalItems / 3).ceil() * 2 - 1;
- }
-
- @override
- Widget build(BuildContext context) {
- return ListView(
- scrollDirection: Axis.horizontal,
- padding: const EdgeInsets.fromLTRB(0.0, 34.0, 16.0, 44.0),
- children: _buildColumns(context),
- physics: const AlwaysScrollableScrollPhysics(),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart b/examples/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart
deleted file mode 100644
index 687685b..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/supplemental/cut_corners_border.dart
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'dart:ui' show lerpDouble;
-
-import 'package:flutter/material.dart';
-import 'package:flutter/widgets.dart';
-
-class CutCornersBorder extends OutlineInputBorder {
- const CutCornersBorder({
- BorderSide borderSide = BorderSide.none,
- BorderRadius borderRadius = const BorderRadius.all(Radius.circular(2.0)),
- this.cut = 7.0,
- double gapPadding = 2.0,
- }) : super(
- borderSide: borderSide,
- borderRadius: borderRadius,
- gapPadding: gapPadding,
- );
-
- @override
- CutCornersBorder copyWith({
- BorderSide borderSide,
- BorderRadius borderRadius,
- double gapPadding,
- double cut,
- }) {
- return CutCornersBorder(
- borderSide: borderSide ?? this.borderSide,
- borderRadius: borderRadius ?? this.borderRadius,
- gapPadding: gapPadding ?? this.gapPadding,
- cut: cut ?? this.cut,
- );
- }
-
- final double cut;
-
- @override
- ShapeBorder lerpFrom(ShapeBorder a, double t) {
- if (a is CutCornersBorder) {
- final CutCornersBorder outline = a;
- return CutCornersBorder(
- borderRadius: BorderRadius.lerp(outline.borderRadius, borderRadius, t),
- borderSide: BorderSide.lerp(outline.borderSide, borderSide, t),
- cut: cut,
- gapPadding: outline.gapPadding,
- );
- }
- return super.lerpFrom(a, t);
- }
-
- @override
- ShapeBorder lerpTo(ShapeBorder b, double t) {
- if (b is CutCornersBorder) {
- final CutCornersBorder outline = b;
- return CutCornersBorder(
- borderRadius: BorderRadius.lerp(borderRadius, outline.borderRadius, t),
- borderSide: BorderSide.lerp(borderSide, outline.borderSide, t),
- cut: cut,
- gapPadding: outline.gapPadding,
- );
- }
- return super.lerpTo(b, t);
- }
-
- Path _notchedCornerPath(Rect center, [double start = 0.0, double extent = 0.0]) {
- final Path path = Path();
- if (start > 0.0 || extent > 0.0) {
- path.relativeMoveTo(extent + start, center.top);
- _notchedSidesAndBottom(center, path);
- path..lineTo(center.left + cut, center.top)..lineTo(start, center.top);
- } else {
- path.moveTo(center.left + cut, center.top);
- _notchedSidesAndBottom(center, path);
- path.lineTo(center.left + cut, center.top);
- }
- return path;
- }
-
- Path _notchedSidesAndBottom(Rect center, Path path) {
- return path
- ..lineTo(center.right - cut, center.top)
- ..lineTo(center.right, center.top + cut)
- ..lineTo(center.right, center.top + center.height - cut)
- ..lineTo(center.right - cut, center.top + center.height)
- ..lineTo(center.left + cut, center.top + center.height)
- ..lineTo(center.left, center.top + center.height - cut)
- ..lineTo(center.left, center.top + cut);
- }
-
- @override
- void paint(
- Canvas canvas,
- Rect rect, {
- double gapStart,
- double gapExtent = 0.0,
- double gapPercentage = 0.0,
- TextDirection textDirection,
- }) {
- assert(gapExtent != null);
- assert(gapPercentage >= 0.0 && gapPercentage <= 1.0);
-
- final Paint paint = borderSide.toPaint();
- final RRect outer = borderRadius.toRRect(rect);
- if (gapStart == null || gapExtent <= 0.0 || gapPercentage == 0.0) {
- canvas.drawPath(_notchedCornerPath(outer.middleRect), paint);
- } else {
- final double extent = lerpDouble(0.0, gapExtent + gapPadding * 2.0, gapPercentage);
- switch (textDirection) {
- case TextDirection.rtl:
- {
- final Path path = _notchedCornerPath(outer.middleRect, gapStart + gapPadding - extent, extent);
- canvas.drawPath(path, paint);
- break;
- }
- case TextDirection.ltr:
- {
- final Path path = _notchedCornerPath(outer.middleRect, gapStart - gapPadding, extent);
- canvas.drawPath(path, paint);
- break;
- }
- }
- }
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart b/examples/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart
deleted file mode 100644
index 2ac33e3..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/supplemental/product_card.dart
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-import 'package:intl/intl.dart';
-import 'package:scoped_model/scoped_model.dart';
-
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-
-class ProductCard extends StatelessWidget {
- const ProductCard({ this.imageAspectRatio = 33 / 49, this.product })
- : assert(imageAspectRatio == null || imageAspectRatio > 0);
-
- final double imageAspectRatio;
- final Product product;
-
- static const double kTextBoxHeight = 65.0;
-
- @override
- Widget build(BuildContext context) {
- final NumberFormat formatter = NumberFormat.simpleCurrency(
- decimalDigits: 0,
- locale: Localizations.localeOf(context).toString(),
- );
-
- final ThemeData theme = Theme.of(context);
-
- final Image imageWidget = Image.asset(
- product.assetName,
- package: product.assetPackage,
- fit: BoxFit.cover,
- );
-
- return ScopedModelDescendant<AppStateModel>(
- builder: (BuildContext context, Widget child, AppStateModel model) {
- return GestureDetector(
- onTap: () {
- model.addProductToCart(product.id);
- // TODO: Add Snackbar
- },
- child: child,
- );
- },
- child: Stack(
- children: <Widget>[
- Column(
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: <Widget>[
- AspectRatio(
- aspectRatio: imageAspectRatio,
- child: imageWidget,
- ),
- SizedBox(
- height: kTextBoxHeight * MediaQuery.of(context).textScaleFactor,
- width: 121.0,
- child: Column(
- mainAxisAlignment: MainAxisAlignment.end,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: <Widget>[
- Text(
- product == null ? '' : product.name,
- style: theme.textTheme.button,
- softWrap: false,
- overflow: TextOverflow.ellipsis,
- maxLines: 1,
- ),
- const SizedBox(height: 4.0),
- Text(
- product == null ? '' : formatter.format(product.price),
- style: theme.textTheme.caption,
- ),
- ],
- ),
- ),
- ],
- ),
- const Padding(
- padding: EdgeInsets.all(16.0),
- child: Icon(Icons.add_shopping_cart),
- ),
- ],
- ),
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart b/examples/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart
deleted file mode 100644
index 6889716..0000000
--- a/examples/flutter_gallery/lib/demo/shrine/supplemental/product_columns.dart
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2018-present the Flutter authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import 'package:flutter/material.dart';
-
-import 'package:flutter_gallery/demo/shrine/model/product.dart';
-import 'package:flutter_gallery/demo/shrine/supplemental/product_card.dart';
-
-class TwoProductCardColumn extends StatelessWidget {
- const TwoProductCardColumn({
- @required this.bottom,
- this.top,
- }) : assert(bottom != null);
-
- final Product bottom, top;
-
- @override
- Widget build(BuildContext context) {
- return LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
- const double spacerHeight = 44.0;
-
- final double heightOfCards = (constraints.biggest.height - spacerHeight) / 2.0;
- final double heightOfImages = heightOfCards - ProductCard.kTextBoxHeight;
- final double imageAspectRatio = (heightOfImages >= 0.0 && constraints.biggest.width > heightOfImages)
- ? constraints.biggest.width / heightOfImages
- : 33 / 49;
-
- return ListView(
- children: <Widget>[
- Padding(
- padding: const EdgeInsetsDirectional.only(start: 28.0),
- child: top != null
- ? ProductCard(
- imageAspectRatio: imageAspectRatio,
- product: top,
- )
- : SizedBox(
- height: heightOfCards > 0 ? heightOfCards : spacerHeight,
- ),
- ),
- const SizedBox(height: spacerHeight),
- Padding(
- padding: const EdgeInsetsDirectional.only(end: 28.0),
- child: ProductCard(
- imageAspectRatio: imageAspectRatio,
- product: bottom,
- ),
- ),
- ],
- );
- });
- }
-}
-
-class OneProductCardColumn extends StatelessWidget {
- const OneProductCardColumn({this.product});
-
- final Product product;
-
- @override
- Widget build(BuildContext context) {
- return ListView(
- reverse: true,
- children: <Widget>[
- const SizedBox(
- height: 40.0,
- ),
- ProductCard(
- product: product,
- ),
- ],
- );
- }
-}
diff --git a/examples/flutter_gallery/lib/demo/shrine_demo.dart b/examples/flutter_gallery/lib/demo/shrine_demo.dart
index 6c58ecd..24cd2d8 100644
--- a/examples/flutter_gallery/lib/demo/shrine_demo.dart
+++ b/examples/flutter_gallery/lib/demo/shrine_demo.dart
@@ -3,13 +3,40 @@
// found in the LICENSE file.
import 'package:flutter/material.dart';
-import 'package:flutter_gallery/demo/shrine/app.dart';
+
+import 'shrine/shrine_home.dart' show ShrineHome;
+import 'shrine/shrine_theme.dart' show ShrineTheme;
+
+// This code would ordinarily be part of the MaterialApp's home. It's being
+// used by the ShrineDemo and by each route pushed from there because this
+// isn't a standalone app with its own main() and MaterialApp.
+Widget buildShrine(BuildContext context, Widget child) {
+ return Theme(
+ data: ThemeData(
+ primarySwatch: Colors.grey,
+ iconTheme: const IconThemeData(color: Color(0xFF707070)),
+ platform: Theme.of(context).platform,
+ ),
+ child: ShrineTheme(child: child)
+ );
+}
+
+// In a standalone version of this app, MaterialPageRoute<T> could be used directly.
+class ShrinePageRoute<T> extends MaterialPageRoute<T> {
+ ShrinePageRoute({
+ WidgetBuilder builder,
+ RouteSettings settings,
+ }) : super(builder: builder, settings: settings);
+
+ @override
+ Widget buildPage(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
+ return buildShrine(context, super.buildPage(context, animation, secondaryAnimation));
+ }
+}
class ShrineDemo extends StatelessWidget {
- const ShrineDemo({ Key key }) : super(key: key);
-
static const String routeName = '/shrine'; // Used by the Gallery app.
@override
- Widget build(BuildContext context) => ShrineApp();
+ Widget build(BuildContext context) => buildShrine(context, ShrineHome());
}
diff --git a/examples/flutter_gallery/lib/gallery/app.dart b/examples/flutter_gallery/lib/gallery/app.dart
index 2d364d8..f1c6d71 100644
--- a/examples/flutter_gallery/lib/gallery/app.dart
+++ b/examples/flutter_gallery/lib/gallery/app.dart
@@ -7,8 +7,6 @@
import 'package:flutter/foundation.dart' show defaultTargetPlatform;
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart' show timeDilation;
-import 'package:flutter_gallery/demo/shrine/model/app_state_model.dart';
-import 'package:scoped_model/scoped_model.dart';
import 'package:url_launcher/url_launcher.dart';
@@ -44,7 +42,6 @@
class _GalleryAppState extends State<GalleryApp> {
GalleryOptions _options;
Timer _timeDilationTimer;
- AppStateModel model;
Map<String, WidgetBuilder> _buildRoutes() {
// For a different example of how to set up an application routing table
@@ -66,7 +63,6 @@
timeDilation: timeDilation,
platform: defaultTargetPlatform,
);
- model = AppStateModel()..loadProducts();
}
@override
@@ -129,24 +125,22 @@
child: home,
);
}
- return ScopedModel<AppStateModel>(
- model: model,
- child: MaterialApp(
- theme: _options.theme.data.copyWith(platform: _options.platform),
- title: 'Flutter Gallery',
- color: Colors.grey,
- showPerformanceOverlay: _options.showPerformanceOverlay,
- checkerboardOffscreenLayers: _options.showOffscreenLayersCheckerboard,
- checkerboardRasterCacheImages: _options.showRasterCacheImagesCheckerboard,
- routes: _buildRoutes(),
- builder: (BuildContext context, Widget child) {
- return Directionality(
- textDirection: _options.textDirection,
- child: _applyTextScaleFactor(child),
- );
- },
- home: home,
- ),
+
+ return MaterialApp(
+ theme: _options.theme.data.copyWith(platform: _options.platform),
+ title: 'Flutter Gallery',
+ color: Colors.grey,
+ showPerformanceOverlay: _options.showPerformanceOverlay,
+ checkerboardOffscreenLayers: _options.showOffscreenLayersCheckerboard,
+ checkerboardRasterCacheImages: _options.showRasterCacheImagesCheckerboard,
+ routes: _buildRoutes(),
+ builder: (BuildContext context, Widget child) {
+ return Directionality(
+ textDirection: _options.textDirection,
+ child: _applyTextScaleFactor(child),
+ );
+ },
+ home: home,
);
}
}
diff --git a/examples/flutter_gallery/lib/gallery/demos.dart b/examples/flutter_gallery/lib/gallery/demos.dart
index 3f7a891..0b18552 100644
--- a/examples/flutter_gallery/lib/gallery/demos.dart
+++ b/examples/flutter_gallery/lib/gallery/demos.dart
@@ -93,7 +93,7 @@
icon: GalleryIcons.shrine,
category: _kDemos,
routeName: ShrineDemo.routeName,
- buildRoute: (BuildContext context) => const ShrineDemo(),
+ buildRoute: (BuildContext context) => ShrineDemo(),
),
GalleryDemo(
title: 'Contact profile',
diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml
index e6b5c39..4c2bd6f 100644
--- a/examples/flutter_gallery/pubspec.yaml
+++ b/examples/flutter_gallery/pubspec.yaml
@@ -15,8 +15,6 @@
url_launcher: 4.0.1
cupertino_icons: 0.1.2
video_player: 0.7.2
- scoped_model: 0.3.0
- shrine_images: 1.1.0
# Also update dev/benchmarks/complex_layout/pubspec.yaml
flutter_gallery_assets: 0.1.6
@@ -36,7 +34,7 @@
flutter_goldens:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -44,7 +42,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -53,7 +51,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -66,7 +64,7 @@
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
process: 3.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -149,46 +147,6 @@
- packages/flutter_gallery_assets/people/square/sandra.png
- packages/flutter_gallery_assets/people/square/stella.png
- packages/flutter_gallery_assets/people/square/trevor.png
- - packages/shrine_images/diamond.png
- - packages/shrine_images/slanted_menu.png
- - packages/shrine_images/0-0.jpg
- - packages/shrine_images/1-0.jpg
- - packages/shrine_images/2-0.jpg
- - packages/shrine_images/3-0.jpg
- - packages/shrine_images/4-0.jpg
- - packages/shrine_images/5-0.jpg
- - packages/shrine_images/6-0.jpg
- - packages/shrine_images/7-0.jpg
- - packages/shrine_images/8-0.jpg
- - packages/shrine_images/9-0.jpg
- - packages/shrine_images/10-0.jpg
- - packages/shrine_images/11-0.jpg
- - packages/shrine_images/12-0.jpg
- - packages/shrine_images/13-0.jpg
- - packages/shrine_images/14-0.jpg
- - packages/shrine_images/15-0.jpg
- - packages/shrine_images/16-0.jpg
- - packages/shrine_images/17-0.jpg
- - packages/shrine_images/18-0.jpg
- - packages/shrine_images/19-0.jpg
- - packages/shrine_images/20-0.jpg
- - packages/shrine_images/21-0.jpg
- - packages/shrine_images/22-0.jpg
- - packages/shrine_images/23-0.jpg
- - packages/shrine_images/24-0.jpg
- - packages/shrine_images/25-0.jpg
- - packages/shrine_images/26-0.jpg
- - packages/shrine_images/27-0.jpg
- - packages/shrine_images/28-0.jpg
- - packages/shrine_images/29-0.jpg
- - packages/shrine_images/30-0.jpg
- - packages/shrine_images/31-0.jpg
- - packages/shrine_images/32-0.jpg
- - packages/shrine_images/33-0.jpg
- - packages/shrine_images/34-0.jpg
- - packages/shrine_images/35-0.jpg
- - packages/shrine_images/36-0.jpg
- - packages/shrine_images/37-0.jpg
fonts:
- family: Raleway
fonts:
@@ -238,4 +196,4 @@
- asset: packages/flutter_gallery_assets/fonts/private/googlesans/GoogleSansDisplay-Regular.ttf
weight: 400
-# PUBSPEC CHECKSUM: 351b
+# PUBSPEC CHECKSUM: 0fd2
diff --git a/examples/hello_world/pubspec.yaml b/examples/hello_world/pubspec.yaml
index 29dcfd3..8d30d42 100644
--- a/examples/hello_world/pubspec.yaml
+++ b/examples/hello_world/pubspec.yaml
@@ -17,7 +17,7 @@
flutter_test:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -25,7 +25,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -34,7 +34,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -46,7 +46,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -68,4 +68,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 53cf
+# PUBSPEC CHECKSUM: e771
diff --git a/examples/layers/pubspec.yaml b/examples/layers/pubspec.yaml
index 131921f..7a1f0d2 100644
--- a/examples/layers/pubspec.yaml
+++ b/examples/layers/pubspec.yaml
@@ -17,7 +17,7 @@
flutter_test:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -25,7 +25,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -34,7 +34,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -46,7 +46,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -70,4 +70,4 @@
- services/data.json
uses-material-design: true
-# PUBSPEC CHECKSUM: 53cf
+# PUBSPEC CHECKSUM: e771
diff --git a/examples/platform_channel/pubspec.yaml b/examples/platform_channel/pubspec.yaml
index 63fa9fe..e6fe6d2 100644
--- a/examples/platform_channel/pubspec.yaml
+++ b/examples/platform_channel/pubspec.yaml
@@ -19,7 +19,7 @@
flutter_driver:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -28,7 +28,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -38,7 +38,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -50,7 +50,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -72,4 +72,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 3901
+# PUBSPEC CHECKSUM: 27a2
diff --git a/examples/platform_channel_swift/pubspec.yaml b/examples/platform_channel_swift/pubspec.yaml
index b4befd0..a5c5406 100644
--- a/examples/platform_channel_swift/pubspec.yaml
+++ b/examples/platform_channel_swift/pubspec.yaml
@@ -19,7 +19,7 @@
flutter_driver:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -28,7 +28,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -38,7 +38,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -50,7 +50,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -72,4 +72,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: 3901
+# PUBSPEC CHECKSUM: 27a2
diff --git a/examples/stocks/pubspec.yaml b/examples/stocks/pubspec.yaml
index 4561cc5..a6806b8 100644
--- a/examples/stocks/pubspec.yaml
+++ b/examples/stocks/pubspec.yaml
@@ -14,7 +14,7 @@
http: 0.12.0
isolate: 2.0.2
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -23,11 +23,11 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dart_style: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -61,7 +61,7 @@
package_resolver: 1.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -78,4 +78,4 @@
flutter:
uses-material-design: true
-# PUBSPEC CHECKSUM: af1a
+# PUBSPEC CHECKSUM: 8bbb
diff --git a/packages/flutter/lib/src/animation/tween_sequence.dart b/packages/flutter/lib/src/animation/tween_sequence.dart
index 78fcfd1..1ff8861 100644
--- a/packages/flutter/lib/src/animation/tween_sequence.dart
+++ b/packages/flutter/lib/src/animation/tween_sequence.dart
@@ -82,9 +82,6 @@
assert(false, 'TweenSequence.evaluate() could not find a interval for $t');
return null;
}
-
- @override
- String toString() => 'TweenSequence(${_items.length} items)';
}
/// A simple holder for one element of a [TweenSequence].
diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml
index 2a7b03c..b30fa41 100644
--- a/packages/flutter/pubspec.yaml
+++ b/packages/flutter/pubspec.yaml
@@ -24,7 +24,7 @@
sdk: flutter
mockito: 3.0.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -33,7 +33,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -43,7 +43,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -57,7 +57,7 @@
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
process: 3.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -76,4 +76,4 @@
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: 7849
+# PUBSPEC CHECKSUM: 23ea
diff --git a/packages/flutter_driver/pubspec.yaml b/packages/flutter_driver/pubspec.yaml
index a279306..e5f4e62 100644
--- a/packages/flutter_driver/pubspec.yaml
+++ b/packages/flutter_driver/pubspec.yaml
@@ -21,7 +21,7 @@
fuchsia_remote_debug_protocol:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -30,7 +30,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -39,7 +39,7 @@
intl: 0.15.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -72,6 +72,6 @@
dev_dependencies:
test: 1.3.4
mockito: 3.0.0
- quiver: 2.0.1
+ quiver: 2.0.0+1
-# PUBSPEC CHECKSUM: 7849
+# PUBSPEC CHECKSUM: 23ea
diff --git a/packages/flutter_goldens/pubspec.yaml b/packages/flutter_goldens/pubspec.yaml
index a067942..40e0777 100644
--- a/packages/flutter_goldens/pubspec.yaml
+++ b/packages/flutter_goldens/pubspec.yaml
@@ -16,7 +16,7 @@
flutter_goldens_client:
path: ../flutter_goldens_client
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -24,7 +24,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -34,7 +34,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -46,7 +46,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -70,4 +70,4 @@
dev_dependencies:
mockito: 3.0.0
-# PUBSPEC CHECKSUM: 7849
+# PUBSPEC CHECKSUM: 23ea
diff --git a/packages/flutter_localizations/pubspec.yaml b/packages/flutter_localizations/pubspec.yaml
index a0ed455..2c52973 100644
--- a/packages/flutter_localizations/pubspec.yaml
+++ b/packages/flutter_localizations/pubspec.yaml
@@ -22,7 +22,7 @@
sdk: flutter
mockito: 3.0.0
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -30,7 +30,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -39,7 +39,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -50,7 +50,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -69,4 +69,4 @@
web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 2.1.15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: cc50
+# PUBSPEC CHECKSUM: 5df1
diff --git a/packages/flutter_test/pubspec.yaml b/packages/flutter_test/pubspec.yaml
index 469dfb3..9a1cbcf 100644
--- a/packages/flutter_test/pubspec.yaml
+++ b/packages/flutter_test/pubspec.yaml
@@ -19,7 +19,7 @@
path: 1.6.2
# We use FakeAsync and other testing utilities.
- quiver: 2.0.1
+ quiver: 2.0.0+1
# We import stack_trace because the test packages uses it and we
# need to be able to unmangle the stack traces that it passed to
@@ -29,7 +29,7 @@
# Used by globalToLocal et al.
vector_math: 2.0.8
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -38,7 +38,7 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -47,7 +47,7 @@
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 2.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -81,4 +81,4 @@
intl: 0.15.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
-# PUBSPEC CHECKSUM: 3901
+# PUBSPEC CHECKSUM: 27a2
diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml
index 305a587..f8d1c94 100644
--- a/packages/flutter_tools/pubspec.yaml
+++ b/packages/flutter_tools/pubspec.yaml
@@ -9,7 +9,7 @@
dependencies:
# To update these, use "flutter update-packages --force-upgrade".
- analyzer: 0.33.1
+ analyzer: 0.33.0
archive: 2.0.4
args: 1.5.0
cli_util: 0.1.3+2
@@ -28,7 +28,7 @@
platform: 2.2.0
plugin: 0.2.0+3
process: 3.0.5
- quiver: 2.0.1
+ quiver: 2.0.0+1
stack_trace: 1.9.3
stream_channel: 1.6.8
usage: 3.4.1
@@ -50,14 +50,14 @@
convert: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dart2_constant: 1.0.2+dart2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_multi_server: 2.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 0.9.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -90,4 +90,4 @@
# Exclude this package from the hosted API docs.
nodoc: true
-# PUBSPEC CHECKSUM: dd55
+# PUBSPEC CHECKSUM: c4f6
diff --git a/packages/fuchsia_remote_debug_protocol/pubspec.yaml b/packages/fuchsia_remote_debug_protocol/pubspec.yaml
index c8ffbd6..8f71f37 100644
--- a/packages/fuchsia_remote_debug_protocol/pubspec.yaml
+++ b/packages/fuchsia_remote_debug_protocol/pubspec.yaml
@@ -16,7 +16,7 @@
flutter_driver:
sdk: flutter
- analyzer: 0.33.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ analyzer: 0.33.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 1.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -26,7 +26,7 @@
crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
csslib: 0.14.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 5.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- front_end: 0.1.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ front_end: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
html: 0.13.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http: 0.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -35,7 +35,7 @@
intl: 0.15.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- kernel: 0.3.6+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ kernel: 0.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
logging: 0.11.3+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.3+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -49,7 +49,7 @@
plugin: 0.2.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.3.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
- quiver: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
+ quiver: 2.0.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 0.7.3+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@@ -72,4 +72,4 @@
mockito: 3.0.0
test: 1.3.4
-# PUBSPEC CHECKSUM: 7849
+# PUBSPEC CHECKSUM: 23ea