Showing
21 changed files
with
113 additions
and
164 deletions
1 | -<img src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/preview.png"> | 1 | +<img src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/preview.png?raw=true"> |
2 | 2 | ||
3 | # Flutter Modal Bottom Sheet | 3 | # Flutter Modal Bottom Sheet |
4 | 4 | ||
5 | Create awesome and powerful modal bottom sheets | 5 | Create awesome and powerful modal bottom sheets |
6 | 6 | ||
7 | -<img align="left" height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/cupertino_shared_view.gif"> | ||
8 | -<img align="left" height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/modal_inside_modal.gif"> | ||
9 | -<img align="left" height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/material_fit.png"> | ||
10 | -<img align="left"height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/bar_modal.png"> | ||
11 | -<img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/avatar_modal.png"> | 7 | +| Cupertino Modal | Multiple Modals | Material Modal | Bar Modal | Create your own | |
8 | +|---|---|---|---|---| | ||
9 | +|<img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/cupertino_shared_view.gif?raw=true">| <img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/modal_inside_modal.gif?raw=true">| <img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/material_fit.png?raw=true">|<img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/bar_modal.png?raw=true">| <img height="300" src="https://github.com/jamesblasco/modal_bottom_sheet/blob/master/screenshots/avatar_modal.png?raw=true">| | ||
10 | + | ||
12 | 11 | ||
13 | 12 | ||
14 | ## Material Modal BottomSheet | 13 | ## Material Modal BottomSheet |
@@ -38,11 +38,13 @@ class MyApp extends StatelessWidget { | @@ -38,11 +38,13 @@ class MyApp extends StatelessWidget { | ||
38 | middle: Text('Normal Navigation Presentation'), | 38 | middle: Text('Normal Navigation Presentation'), |
39 | trailing: GestureDetector( | 39 | trailing: GestureDetector( |
40 | child: Icon(Icons.arrow_upward), | 40 | child: Icon(Icons.arrow_upward), |
41 | - onTap: () => CupertinoScaffold.showCupertinoModalBottomSheet( | 41 | + onTap: () => CupertinoScaffold |
42 | + .showCupertinoModalBottomSheet( | ||
42 | expand: true, | 43 | expand: true, |
43 | context: context, | 44 | context: context, |
44 | backgroundColor: Colors.transparent, | 45 | backgroundColor: Colors.transparent, |
45 | - builder: (context, scrollController) => Stack( | 46 | + builder: (context, scrollController) => |
47 | + Stack( | ||
46 | children: <Widget>[ | 48 | children: <Widget>[ |
47 | ModalWithScroll( | 49 | ModalWithScroll( |
48 | scrollController: scrollController), | 50 | scrollController: scrollController), |
@@ -52,7 +54,8 @@ class MyApp extends StatelessWidget { | @@ -52,7 +54,8 @@ class MyApp extends StatelessWidget { | ||
52 | right: 40, | 54 | right: 40, |
53 | bottom: 20, | 55 | bottom: 20, |
54 | child: MaterialButton( | 56 | child: MaterialButton( |
55 | - onPressed: () => Navigator.of(context) | 57 | + onPressed: () => Navigator.of( |
58 | + context) | ||
56 | .popUntil((route) => | 59 | .popUntil((route) => |
57 | route.settings.name == '/'), | 60 | route.settings.name == '/'), |
58 | child: Text('Pop back home'), | 61 | child: Text('Pop back home'), |
@@ -64,7 +67,9 @@ class MyApp extends StatelessWidget { | @@ -64,7 +67,9 @@ class MyApp extends StatelessWidget { | ||
64 | ), | 67 | ), |
65 | child: Center(child: Container()), | 68 | child: Center(child: Container()), |
66 | ), | 69 | ), |
67 | - ),),), | 70 | + ), |
71 | + ), | ||
72 | + ), | ||
68 | settings: settings); | 73 | settings: settings); |
69 | }, | 74 | }, |
70 | debugShowCheckedModeBanner: false, | 75 | debugShowCheckedModeBanner: false, |
@@ -114,8 +119,7 @@ class _MyHomePageState extends State<MyHomePage> { | @@ -114,8 +119,7 @@ class _MyHomePageState extends State<MyHomePage> { | ||
114 | context: context, | 119 | context: context, |
115 | backgroundColor: Colors.transparent, | 120 | backgroundColor: Colors.transparent, |
116 | builder: (context, scrollController) => | 121 | builder: (context, scrollController) => |
117 | - ModalFit( | ||
118 | - scrollController: scrollController), | 122 | + ModalFit(scrollController: scrollController), |
119 | )), | 123 | )), |
120 | ListTile( | 124 | ListTile( |
121 | title: Text('Bar Modal'), | 125 | title: Text('Bar Modal'), |
@@ -144,8 +148,7 @@ class _MyHomePageState extends State<MyHomePage> { | @@ -144,8 +148,7 @@ class _MyHomePageState extends State<MyHomePage> { | ||
144 | context: context, | 148 | context: context, |
145 | backgroundColor: Colors.transparent, | 149 | backgroundColor: Colors.transparent, |
146 | builder: (context, scrollController) => | 150 | builder: (context, scrollController) => |
147 | - ModalFit( | ||
148 | - scrollController: scrollController), | 151 | + ModalFit(scrollController: scrollController), |
149 | )), | 152 | )), |
150 | ListTile( | 153 | ListTile( |
151 | title: Text('Cupertino Small Modal forzed to expand'), | 154 | title: Text('Cupertino Small Modal forzed to expand'), |
@@ -154,13 +157,11 @@ class _MyHomePageState extends State<MyHomePage> { | @@ -154,13 +157,11 @@ class _MyHomePageState extends State<MyHomePage> { | ||
154 | context: context, | 157 | context: context, |
155 | backgroundColor: Colors.transparent, | 158 | backgroundColor: Colors.transparent, |
156 | builder: (context, scrollController) => | 159 | builder: (context, scrollController) => |
157 | - ModalFit( | ||
158 | - scrollController: scrollController), | 160 | + ModalFit(scrollController: scrollController), |
159 | )), | 161 | )), |
160 | ListTile( | 162 | ListTile( |
161 | title: Text('Cupertino Modal inside modal'), | 163 | title: Text('Cupertino Modal inside modal'), |
162 | - onTap: () => | ||
163 | - showCupertinoModalBottomSheet( | 164 | + onTap: () => showCupertinoModalBottomSheet( |
164 | expand: true, | 165 | expand: true, |
165 | context: context, | 166 | context: context, |
166 | backgroundColor: Colors.transparent, | 167 | backgroundColor: Colors.transparent, |
@@ -169,8 +170,7 @@ class _MyHomePageState extends State<MyHomePage> { | @@ -169,8 +170,7 @@ class _MyHomePageState extends State<MyHomePage> { | ||
169 | scrollController: scrollController), | 170 | scrollController: scrollController), |
170 | )), | 171 | )), |
171 | ListTile( | 172 | ListTile( |
172 | - title: | ||
173 | - Text('Cupertino Navigator + Scroll + WillScope'), | 173 | + title: Text('Cupertino Navigator + Scroll + WillScope'), |
174 | onTap: () => showCupertinoModalBottomSheet( | 174 | onTap: () => showCupertinoModalBottomSheet( |
175 | expand: true, | 175 | expand: true, |
176 | context: context, | 176 | context: context, |
@@ -194,7 +194,6 @@ class _MyHomePageState extends State<MyHomePage> { | @@ -194,7 +194,6 @@ class _MyHomePageState extends State<MyHomePage> { | ||
194 | ), | 194 | ), |
195 | ), | 195 | ), |
196 | ), | 196 | ), |
197 | - | ||
198 | ), | 197 | ), |
199 | ); | 198 | ); |
200 | } | 199 | } |
@@ -28,7 +28,8 @@ class AvatarBottomSheet extends StatelessWidget { | @@ -28,7 +28,8 @@ class AvatarBottomSheet extends StatelessWidget { | ||
28 | builder: (context, child) => Transform.translate( | 28 | builder: (context, child) => Transform.translate( |
29 | offset: Offset(0, (1 - animation.value) * 100), | 29 | offset: Offset(0, (1 - animation.value) * 100), |
30 | child: Opacity( | 30 | child: Opacity( |
31 | - child: child, opacity: max(0, animation.value * 2 - 1))), | 31 | + child: child, |
32 | + opacity: max(0, animation.value * 2 - 1))), | ||
32 | child: Row( | 33 | child: Row( |
33 | children: <Widget>[ | 34 | children: <Widget>[ |
34 | SizedBox(width: 20), | 35 | SizedBox(width: 20), |
1 | - | ||
2 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
3 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
4 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; | 3 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; |
@@ -12,7 +11,8 @@ class ModalInsideModal extends StatelessWidget { | @@ -12,7 +11,8 @@ class ModalInsideModal extends StatelessWidget { | ||
12 | 11 | ||
13 | @override | 12 | @override |
14 | Widget build(BuildContext context) { | 13 | Widget build(BuildContext context) { |
15 | - return Material(child:CupertinoPageScaffold( | 14 | + return Material( |
15 | + child: CupertinoPageScaffold( | ||
16 | navigationBar: CupertinoNavigationBar( | 16 | navigationBar: CupertinoNavigationBar( |
17 | leading: Container(), middle: Text('Modal Page')), | 17 | leading: Container(), middle: Text('Modal Page')), |
18 | child: SafeArea( | 18 | child: SafeArea( |
@@ -33,14 +33,12 @@ class ModalInsideModal extends StatelessWidget { | @@ -33,14 +33,12 @@ class ModalInsideModal extends StatelessWidget { | ||
33 | context: context, | 33 | context: context, |
34 | backgroundColor: Colors.transparent, | 34 | backgroundColor: Colors.transparent, |
35 | builder: (context, scrollController) => | 35 | builder: (context, scrollController) => |
36 | - ModalInsideModal(scrollController: scrollController), | 36 | + ModalInsideModal( |
37 | + scrollController: scrollController), | ||
37 | )), | 38 | )), |
38 | - | ||
39 | - ) | ||
40 | - ).toList(), | 39 | + )).toList(), |
41 | ), | 40 | ), |
42 | ), | 41 | ), |
43 | )); | 42 | )); |
44 | } | 43 | } |
45 | } | 44 | } |
46 | - |
1 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
2 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
3 | + | ||
3 | class SimpleModal extends StatelessWidget { | 4 | class SimpleModal extends StatelessWidget { |
4 | final ScrollController scrollController; | 5 | final ScrollController scrollController; |
5 | 6 | ||
@@ -7,7 +8,8 @@ class SimpleModal extends StatelessWidget { | @@ -7,7 +8,8 @@ class SimpleModal extends StatelessWidget { | ||
7 | 8 | ||
8 | @override | 9 | @override |
9 | Widget build(BuildContext context) { | 10 | Widget build(BuildContext context) { |
10 | - return Material(child:CupertinoPageScaffold( | 11 | + return Material( |
12 | + child: CupertinoPageScaffold( | ||
11 | navigationBar: CupertinoNavigationBar( | 13 | navigationBar: CupertinoNavigationBar( |
12 | leading: Container(), middle: Text('Modal Page')), | 14 | leading: Container(), middle: Text('Modal Page')), |
13 | child: Center(), | 15 | child: Center(), |
@@ -8,7 +8,8 @@ class ModalWillScope extends StatelessWidget { | @@ -8,7 +8,8 @@ class ModalWillScope extends StatelessWidget { | ||
8 | 8 | ||
9 | @override | 9 | @override |
10 | Widget build(BuildContext context) { | 10 | Widget build(BuildContext context) { |
11 | - return Material(child: WillPopScope( | 11 | + return Material( |
12 | + child: WillPopScope( | ||
12 | onWillPop: () async { | 13 | onWillPop: () async { |
13 | bool shouldClose = true; | 14 | bool shouldClose = true; |
14 | await showCupertinoDialog( | 15 | await showCupertinoDialog( |
1 | - | ||
2 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
3 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
4 | 3 | ||
@@ -9,7 +8,8 @@ class ModalWithNavigator extends StatelessWidget { | @@ -9,7 +8,8 @@ class ModalWithNavigator extends StatelessWidget { | ||
9 | 8 | ||
10 | @override | 9 | @override |
11 | Widget build(BuildContext context) { | 10 | Widget build(BuildContext context) { |
12 | - return Material( child: Navigator( | 11 | + return Material( |
12 | + child: Navigator( | ||
13 | onGenerateRoute: (_) => MaterialPageRoute( | 13 | onGenerateRoute: (_) => MaterialPageRoute( |
14 | builder: (context) => Builder( | 14 | builder: (context) => Builder( |
15 | builder: (context) => CupertinoPageScaffold( | 15 | builder: (context) => CupertinoPageScaffold( |
@@ -27,20 +27,14 @@ class ModalWithNavigator extends StatelessWidget { | @@ -27,20 +27,14 @@ class ModalWithNavigator extends StatelessWidget { | ||
27 | (index) => ListTile( | 27 | (index) => ListTile( |
28 | title: Text('Item'), | 28 | title: Text('Item'), |
29 | onTap: () { | 29 | onTap: () { |
30 | - Navigator.of(context).push( | ||
31 | - MaterialPageRoute( | ||
32 | - builder: (context) => | ||
33 | - CupertinoPageScaffold( | ||
34 | - navigationBar: | ||
35 | - CupertinoNavigationBar( | ||
36 | - middle: Text( | ||
37 | - 'New Page'), | 30 | + Navigator.of(context).push(MaterialPageRoute( |
31 | + builder: (context) => CupertinoPageScaffold( | ||
32 | + navigationBar: CupertinoNavigationBar( | ||
33 | + middle: Text('New Page'), | ||
38 | ), | 34 | ), |
39 | child: Stack( | 35 | child: Stack( |
40 | - fit: | ||
41 | - StackFit.expand, | ||
42 | - children: < | ||
43 | - Widget>[], | 36 | + fit: StackFit.expand, |
37 | + children: <Widget>[], | ||
44 | )))); | 38 | )))); |
45 | }, | 39 | }, |
46 | )), | 40 | )), |
@@ -49,8 +43,7 @@ class ModalWithNavigator extends StatelessWidget { | @@ -49,8 +43,7 @@ class ModalWithNavigator extends StatelessWidget { | ||
49 | ), | 43 | ), |
50 | ), | 44 | ), |
51 | ), | 45 | ), |
52 | - ),) | ||
53 | - ); | 46 | + ), |
47 | + )); | ||
54 | } | 48 | } |
55 | } | 49 | } |
56 | - |
@@ -7,42 +7,42 @@ packages: | @@ -7,42 +7,42 @@ packages: | ||
7 | name: archive | 7 | name: archive |
8 | url: "https://pub.dartlang.org" | 8 | url: "https://pub.dartlang.org" |
9 | source: hosted | 9 | source: hosted |
10 | - version: "2.0.13" | 10 | + version: "2.0.11" |
11 | args: | 11 | args: |
12 | dependency: transitive | 12 | dependency: transitive |
13 | description: | 13 | description: |
14 | name: args | 14 | name: args |
15 | url: "https://pub.dartlang.org" | 15 | url: "https://pub.dartlang.org" |
16 | source: hosted | 16 | source: hosted |
17 | - version: "1.6.0" | 17 | + version: "1.5.2" |
18 | async: | 18 | async: |
19 | dependency: transitive | 19 | dependency: transitive |
20 | description: | 20 | description: |
21 | name: async | 21 | name: async |
22 | url: "https://pub.dartlang.org" | 22 | url: "https://pub.dartlang.org" |
23 | source: hosted | 23 | source: hosted |
24 | - version: "2.4.1" | 24 | + version: "2.4.0" |
25 | boolean_selector: | 25 | boolean_selector: |
26 | dependency: transitive | 26 | dependency: transitive |
27 | description: | 27 | description: |
28 | name: boolean_selector | 28 | name: boolean_selector |
29 | url: "https://pub.dartlang.org" | 29 | url: "https://pub.dartlang.org" |
30 | source: hosted | 30 | source: hosted |
31 | - version: "2.0.0" | 31 | + version: "1.0.5" |
32 | charcode: | 32 | charcode: |
33 | dependency: transitive | 33 | dependency: transitive |
34 | description: | 34 | description: |
35 | name: charcode | 35 | name: charcode |
36 | url: "https://pub.dartlang.org" | 36 | url: "https://pub.dartlang.org" |
37 | source: hosted | 37 | source: hosted |
38 | - version: "1.1.3" | 38 | + version: "1.1.2" |
39 | collection: | 39 | collection: |
40 | dependency: transitive | 40 | dependency: transitive |
41 | description: | 41 | description: |
42 | name: collection | 42 | name: collection |
43 | url: "https://pub.dartlang.org" | 43 | url: "https://pub.dartlang.org" |
44 | source: hosted | 44 | source: hosted |
45 | - version: "1.14.12" | 45 | + version: "1.14.11" |
46 | convert: | 46 | convert: |
47 | dependency: transitive | 47 | dependency: transitive |
48 | description: | 48 | description: |
@@ -56,7 +56,7 @@ packages: | @@ -56,7 +56,7 @@ packages: | ||
56 | name: crypto | 56 | name: crypto |
57 | url: "https://pub.dartlang.org" | 57 | url: "https://pub.dartlang.org" |
58 | source: hosted | 58 | source: hosted |
59 | - version: "2.1.4" | 59 | + version: "2.1.3" |
60 | cupertino_icons: | 60 | cupertino_icons: |
61 | dependency: "direct main" | 61 | dependency: "direct main" |
62 | description: | 62 | description: |
@@ -80,7 +80,7 @@ packages: | @@ -80,7 +80,7 @@ packages: | ||
80 | name: image | 80 | name: image |
81 | url: "https://pub.dartlang.org" | 81 | url: "https://pub.dartlang.org" |
82 | source: hosted | 82 | source: hosted |
83 | - version: "2.1.12" | 83 | + version: "2.1.4" |
84 | matcher: | 84 | matcher: |
85 | dependency: transitive | 85 | dependency: transitive |
86 | description: | 86 | description: |
@@ -101,7 +101,7 @@ packages: | @@ -101,7 +101,7 @@ packages: | ||
101 | path: ".." | 101 | path: ".." |
102 | relative: true | 102 | relative: true |
103 | source: path | 103 | source: path |
104 | - version: "0.0.1" | 104 | + version: "0.1.0" |
105 | path: | 105 | path: |
106 | dependency: transitive | 106 | dependency: transitive |
107 | description: | 107 | description: |
@@ -109,6 +109,13 @@ packages: | @@ -109,6 +109,13 @@ packages: | ||
109 | url: "https://pub.dartlang.org" | 109 | url: "https://pub.dartlang.org" |
110 | source: hosted | 110 | source: hosted |
111 | version: "1.6.4" | 111 | version: "1.6.4" |
112 | + pedantic: | ||
113 | + dependency: transitive | ||
114 | + description: | ||
115 | + name: pedantic | ||
116 | + url: "https://pub.dartlang.org" | ||
117 | + source: hosted | ||
118 | + version: "1.8.0+1" | ||
112 | petitparser: | 119 | petitparser: |
113 | dependency: transitive | 120 | dependency: transitive |
114 | description: | 121 | description: |
@@ -122,7 +129,7 @@ packages: | @@ -122,7 +129,7 @@ packages: | ||
122 | name: quiver | 129 | name: quiver |
123 | url: "https://pub.dartlang.org" | 130 | url: "https://pub.dartlang.org" |
124 | source: hosted | 131 | source: hosted |
125 | - version: "2.1.3" | 132 | + version: "2.0.5" |
126 | sky_engine: | 133 | sky_engine: |
127 | dependency: transitive | 134 | dependency: transitive |
128 | description: flutter | 135 | description: flutter |
@@ -134,7 +141,7 @@ packages: | @@ -134,7 +141,7 @@ packages: | ||
134 | name: source_span | 141 | name: source_span |
135 | url: "https://pub.dartlang.org" | 142 | url: "https://pub.dartlang.org" |
136 | source: hosted | 143 | source: hosted |
137 | - version: "1.7.0" | 144 | + version: "1.5.5" |
138 | stack_trace: | 145 | stack_trace: |
139 | dependency: transitive | 146 | dependency: transitive |
140 | description: | 147 | description: |
@@ -169,7 +176,7 @@ packages: | @@ -169,7 +176,7 @@ packages: | ||
169 | name: test_api | 176 | name: test_api |
170 | url: "https://pub.dartlang.org" | 177 | url: "https://pub.dartlang.org" |
171 | source: hosted | 178 | source: hosted |
172 | - version: "0.2.15" | 179 | + version: "0.2.11" |
173 | typed_data: | 180 | typed_data: |
174 | dependency: transitive | 181 | dependency: transitive |
175 | description: | 182 | description: |
@@ -190,6 +197,6 @@ packages: | @@ -190,6 +197,6 @@ packages: | ||
190 | name: xml | 197 | name: xml |
191 | url: "https://pub.dartlang.org" | 198 | url: "https://pub.dartlang.org" |
192 | source: hosted | 199 | source: hosted |
193 | - version: "3.6.1" | 200 | + version: "3.5.0" |
194 | sdks: | 201 | sdks: |
195 | - dart: ">=2.7.0 <3.0.0" | 202 | + dart: ">=2.4.0 <3.0.0" |
@@ -4,5 +4,3 @@ | @@ -4,5 +4,3 @@ | ||
4 | // utility that Flutter provides. For example, you can send tap and scroll | 4 | // utility that Flutter provides. For example, you can send tap and scroll |
5 | // gestures. You can also use WidgetTester to find child widgets in the widget | 5 | // gestures. You can also use WidgetTester to find child widgets in the widget |
6 | // tree, read text, and verify that the values of widget properties are correct. | 6 | // tree, read text, and verify that the values of widget properties are correct. |
7 | - | ||
8 | - |
@@ -3,7 +3,6 @@ | @@ -3,7 +3,6 @@ | ||
3 | // found in the LICENSE file. | 3 | // found in the LICENSE file. |
4 | 4 | ||
5 | import 'dart:async'; | 5 | import 'dart:async'; |
6 | -import 'dart:math'; | ||
7 | 6 | ||
8 | import 'package:flutter/cupertino.dart'; | 7 | import 'package:flutter/cupertino.dart'; |
9 | import 'package:flutter/foundation.dart'; | 8 | import 'package:flutter/foundation.dart'; |
@@ -12,8 +11,6 @@ import 'package:flutter/material.dart'; | @@ -12,8 +11,6 @@ import 'package:flutter/material.dart'; | ||
12 | import 'package:flutter/scheduler.dart'; | 11 | import 'package:flutter/scheduler.dart'; |
13 | import 'package:flutter/widgets.dart'; | 12 | import 'package:flutter/widgets.dart'; |
14 | 13 | ||
15 | -import 'bottom_sheet_route.dart'; | ||
16 | - | ||
17 | const Duration _bottomSheetDuration = Duration(milliseconds: 400); | 14 | const Duration _bottomSheetDuration = Duration(milliseconds: 400); |
18 | const double _minFlingVelocity = 500.0; | 15 | const double _minFlingVelocity = 500.0; |
19 | const double _closeProgressThreshold = 0.5; | 16 | const double _closeProgressThreshold = 0.5; |
@@ -158,8 +155,8 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | @@ -158,8 +155,8 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | ||
158 | 155 | ||
159 | bool _isCheckingShouldClose = false; | 156 | bool _isCheckingShouldClose = false; |
160 | FutureOr<bool> shouldClose() async { | 157 | FutureOr<bool> shouldClose() async { |
161 | - if(_isCheckingShouldClose) return false; | ||
162 | - if(widget.shouldClose == null) return null; | 158 | + if (_isCheckingShouldClose) return false; |
159 | + if (widget.shouldClose == null) return null; | ||
163 | _isCheckingShouldClose = true; | 160 | _isCheckingShouldClose = true; |
164 | final result = await widget.shouldClose(); | 161 | final result = await widget.shouldClose(); |
165 | _isCheckingShouldClose = false; | 162 | _isCheckingShouldClose = false; |
@@ -203,7 +200,6 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | @@ -203,7 +200,6 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | ||
203 | isDragging = false; | 200 | isDragging = false; |
204 | _bounceDragController.reverse(); | 201 | _bounceDragController.reverse(); |
205 | 202 | ||
206 | - | ||
207 | bool canClose = true; | 203 | bool canClose = true; |
208 | if (widget.shouldClose != null && hasReachedWillPopThreshold) { | 204 | if (widget.shouldClose != null && hasReachedWillPopThreshold) { |
209 | _cancelClose(); | 205 | _cancelClose(); |
@@ -273,20 +269,18 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | @@ -273,20 +269,18 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> | ||
273 | child, | 269 | child, |
274 | ); | 270 | ); |
275 | 271 | ||
276 | - | ||
277 | // Todo: Add curved Animation when push and pop without gesture | 272 | // Todo: Add curved Animation when push and pop without gesture |
278 | - final Animation<double> containerAnimation = CurvedAnimation( | 273 | + /* final Animation<double> containerAnimation = CurvedAnimation( |
279 | parent: widget.animationController, | 274 | parent: widget.animationController, |
280 | curve: Curves.easeOut, | 275 | curve: Curves.easeOut, |
281 | - ); | 276 | + );*/ |
282 | 277 | ||
283 | return AnimatedBuilder( | 278 | return AnimatedBuilder( |
284 | animation: widget.animationController, | 279 | animation: widget.animationController, |
285 | builder: (context, _) => ClipRect( | 280 | builder: (context, _) => ClipRect( |
286 | child: CustomSingleChildLayout( | 281 | child: CustomSingleChildLayout( |
287 | delegate: _ModalBottomSheetLayout( | 282 | delegate: _ModalBottomSheetLayout( |
288 | - widget.animationController.value, | ||
289 | - widget.expanded), | 283 | + widget.animationController.value, widget.expanded), |
290 | child: !widget.enableDrag | 284 | child: !widget.enableDrag |
291 | ? child | 285 | ? child |
292 | : KeyedSubtree( | 286 | : KeyedSubtree( |
1 | import 'dart:async'; | 1 | import 'dart:async'; |
2 | 2 | ||
3 | import 'package:flutter/cupertino.dart'; | 3 | import 'package:flutter/cupertino.dart'; |
4 | -import 'package:flutter/foundation.dart'; | ||
5 | -import 'package:flutter/gestures.dart'; | ||
6 | import 'package:flutter/material.dart'; | 4 | import 'package:flutter/material.dart'; |
7 | -import 'package:flutter/scheduler.dart'; | ||
8 | -import 'package:flutter/widgets.dart'; | ||
9 | 5 | ||
10 | import '../modal_bottom_sheet.dart'; | 6 | import '../modal_bottom_sheet.dart'; |
11 | -import 'material_with_modal_page_route.dart'; | ||
12 | 7 | ||
13 | const Duration _bottomSheetDuration = Duration(milliseconds: 400); | 8 | const Duration _bottomSheetDuration = Duration(milliseconds: 400); |
14 | 9 | ||
15 | -class _ModalBottomSheetLayout extends SingleChildLayoutDelegate { | ||
16 | - _ModalBottomSheetLayout(this.progress, this.expand); | ||
17 | - | ||
18 | - final double progress; | ||
19 | - final bool expand; | ||
20 | - | ||
21 | - @override | ||
22 | - BoxConstraints getConstraintsForChild(BoxConstraints constraints) { | ||
23 | - return BoxConstraints( | ||
24 | - minWidth: constraints.maxWidth, | ||
25 | - maxWidth: constraints.maxWidth, | ||
26 | - minHeight: expand ? constraints.maxHeight : 0, | ||
27 | - maxHeight: expand ? constraints.maxHeight : constraints.minHeight, | ||
28 | - ); | ||
29 | - } | ||
30 | - | ||
31 | - @override | ||
32 | - Offset getPositionForChild(Size size, Size childSize) { | ||
33 | - return Offset(0.0, size.height - childSize.height * progress); | ||
34 | - } | ||
35 | - | ||
36 | - @override | ||
37 | - bool shouldRelayout(_ModalBottomSheetLayout oldDelegate) { | ||
38 | - return progress != oldDelegate.progress; | ||
39 | - } | ||
40 | -} | ||
41 | - | ||
42 | class _ModalBottomSheet<T> extends StatefulWidget { | 10 | class _ModalBottomSheet<T> extends StatefulWidget { |
43 | const _ModalBottomSheet({ | 11 | const _ModalBottomSheet({ |
44 | Key key, | 12 | Key key, |
@@ -65,13 +33,14 @@ class _ModalBottomSheet<T> extends StatefulWidget { | @@ -65,13 +33,14 @@ class _ModalBottomSheet<T> extends StatefulWidget { | ||
65 | 33 | ||
66 | class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | 34 | class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { |
67 | String _getRouteLabel(MaterialLocalizations localizations) { | 35 | String _getRouteLabel(MaterialLocalizations localizations) { |
68 | - switch (Theme.of(context).platform) { | 36 | + final platform = Theme.of(context).platform; |
37 | + switch (platform) { | ||
69 | case TargetPlatform.iOS: | 38 | case TargetPlatform.iOS: |
70 | - case TargetPlatform.macOS: | ||
71 | return ''; | 39 | return ''; |
72 | case TargetPlatform.android: | 40 | case TargetPlatform.android: |
73 | case TargetPlatform.fuchsia: | 41 | case TargetPlatform.fuchsia: |
74 | return localizations.dialogLabel; | 42 | return localizations.dialogLabel; |
43 | + break; | ||
75 | } | 44 | } |
76 | return null; | 45 | return null; |
77 | } | 46 | } |
@@ -100,9 +69,6 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | @@ -100,9 +69,6 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | ||
100 | MaterialLocalizations.of(context); | 69 | MaterialLocalizations.of(context); |
101 | final String routeLabel = _getRouteLabel(localizations); | 70 | final String routeLabel = _getRouteLabel(localizations); |
102 | 71 | ||
103 | - | ||
104 | - | ||
105 | - | ||
106 | return AnimatedBuilder( | 72 | return AnimatedBuilder( |
107 | animation: widget.route._animationController, | 73 | animation: widget.route._animationController, |
108 | builder: (BuildContext context, Widget child) { | 74 | builder: (BuildContext context, Widget child) { |
@@ -117,7 +83,7 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | @@ -117,7 +83,7 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | ||
117 | expanded: widget.route.expanded, | 83 | expanded: widget.route.expanded, |
118 | containerBuilder: widget.route.containerBuilder, | 84 | containerBuilder: widget.route.containerBuilder, |
119 | animationController: widget.route._animationController, | 85 | animationController: widget.route._animationController, |
120 | - shouldClose: widget.route.hasScopedWillPopCallback | 86 | + shouldClose: widget.route._hasScopedWillPopCallback |
121 | ? () async { | 87 | ? () async { |
122 | final willPop = await widget.route.willPop(); | 88 | final willPop = await widget.route.willPop(); |
123 | return willPop != RoutePopDisposition.doNotPop; | 89 | return willPop != RoutePopDisposition.doNotPop; |
@@ -132,8 +98,6 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | @@ -132,8 +98,6 @@ class _ModalBottomSheetState<T> extends State<_ModalBottomSheet<T>> { | ||
132 | enableDrag: widget.enableDrag, | 98 | enableDrag: widget.enableDrag, |
133 | bounce: widget.bounce, | 99 | bounce: widget.bounce, |
134 | ), | 100 | ), |
135 | - | ||
136 | - | ||
137 | ); | 101 | ); |
138 | }, | 102 | }, |
139 | ); | 103 | ); |
@@ -191,6 +155,8 @@ class ModalBottomSheetRoute<T> extends PopupRoute<T> { | @@ -191,6 +155,8 @@ class ModalBottomSheetRoute<T> extends PopupRoute<T> { | ||
191 | return _animationController; | 155 | return _animationController; |
192 | } | 156 | } |
193 | 157 | ||
158 | + bool get _hasScopedWillPopCallback => hasScopedWillPopCallback; | ||
159 | + | ||
194 | @override | 160 | @override |
195 | Widget buildPage(BuildContext context, Animation<double> animation, | 161 | Widget buildPage(BuildContext context, Animation<double> animation, |
196 | Animation<double> secondaryAnimation) { | 162 | Animation<double> secondaryAnimation) { |
1 | - | ||
2 | - | ||
3 | - | ||
4 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
5 | import 'package:flutter/services.dart'; | 2 | import 'package:flutter/services.dart'; |
3 | +import 'dart:async'; | ||
6 | 4 | ||
7 | import '../../modal_bottom_sheet.dart'; | 5 | import '../../modal_bottom_sheet.dart'; |
8 | import '../bottom_sheet_route.dart'; | 6 | import '../bottom_sheet_route.dart'; |
@@ -49,16 +47,12 @@ class BarBottomSheet extends StatelessWidget { | @@ -49,16 +47,12 @@ class BarBottomSheet extends StatelessWidget { | ||
49 | ]), | 47 | ]), |
50 | width: double.infinity, | 48 | width: double.infinity, |
51 | child: MediaQuery.removePadding( | 49 | child: MediaQuery.removePadding( |
52 | - context: context, | ||
53 | - removeTop: true, | ||
54 | - child: child | ||
55 | - ) | ||
56 | - ), | 50 | + context: context, removeTop: true, child: child)), |
57 | ), | 51 | ), |
58 | ), | 52 | ), |
59 | - ]),); | 53 | + ]), |
54 | + ); | ||
60 | } | 55 | } |
61 | - | ||
62 | } | 56 | } |
63 | 57 | ||
64 | Future<T> showBarModalBottomSheet<T>({ | 58 | Future<T> showBarModalBottomSheet<T>({ |
@@ -88,7 +82,9 @@ Future<T> showBarModalBottomSheet<T>({ | @@ -88,7 +82,9 @@ Future<T> showBarModalBottomSheet<T>({ | ||
88 | .push(ModalBottomSheetRoute<T>( | 82 | .push(ModalBottomSheetRoute<T>( |
89 | builder: builder, | 83 | builder: builder, |
90 | bounce: bounce, | 84 | bounce: bounce, |
91 | - containerBuilder: (_, __, child) => BarBottomSheet(child: child,), | 85 | + containerBuilder: (_, __, child) => BarBottomSheet( |
86 | + child: child, | ||
87 | + ), | ||
92 | secondAnimationController: secondAnimation, | 88 | secondAnimationController: secondAnimation, |
93 | expanded: expand, | 89 | expanded: expand, |
94 | barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, | 90 | barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, |
@@ -98,4 +94,3 @@ Future<T> showBarModalBottomSheet<T>({ | @@ -98,4 +94,3 @@ Future<T> showBarModalBottomSheet<T>({ | ||
98 | )); | 94 | )); |
99 | return result; | 95 | return result; |
100 | } | 96 | } |
101 | - |
@@ -8,7 +8,6 @@ import 'package:flutter/cupertino.dart'; | @@ -8,7 +8,6 @@ import 'package:flutter/cupertino.dart'; | ||
8 | import 'package:flutter/foundation.dart'; | 8 | import 'package:flutter/foundation.dart'; |
9 | import 'package:flutter/gestures.dart'; | 9 | import 'package:flutter/gestures.dart'; |
10 | import 'package:flutter/material.dart'; | 10 | import 'package:flutter/material.dart'; |
11 | -import 'package:flutter/scheduler.dart'; | ||
12 | import 'package:flutter/services.dart'; | 11 | import 'package:flutter/services.dart'; |
13 | import 'package:flutter/widgets.dart'; | 12 | import 'package:flutter/widgets.dart'; |
14 | 13 | ||
@@ -200,7 +199,9 @@ class _CupertinoModalTransition extends StatelessWidget { | @@ -200,7 +199,9 @@ class _CupertinoModalTransition extends StatelessWidget { | ||
200 | final progress = curvedAnimation.value; | 199 | final progress = curvedAnimation.value; |
201 | final yOffset = progress * paddingTop; | 200 | final yOffset = progress * paddingTop; |
202 | final scale = 1 - progress / 10; | 201 | final scale = 1 - progress / 10; |
203 | - final radius = progress == 0 ? 0.0 : (1 - progress) * startRoundCorner + progress * 12; | 202 | + final radius = progress == 0 |
203 | + ? 0.0 | ||
204 | + : (1 - progress) * startRoundCorner + progress * 12; | ||
204 | return Stack( | 205 | return Stack( |
205 | children: <Widget>[ | 206 | children: <Widget>[ |
206 | Container(color: Colors.black), | 207 | Container(color: Colors.black), |
1 | - | ||
2 | - | ||
3 | - | ||
4 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
5 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; | 2 | import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; |
3 | +import 'dart:async'; | ||
6 | 4 | ||
7 | /// Shows a modal material design bottom sheet. | 5 | /// Shows a modal material design bottom sheet. |
8 | Future<T> showMaterialModalBottomSheet<T>({ | 6 | Future<T> showMaterialModalBottomSheet<T>({ |
1 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
2 | import 'package:flutter/foundation.dart'; | 2 | import 'package:flutter/foundation.dart'; |
3 | import 'package:flutter/material.dart'; | 3 | import 'package:flutter/material.dart'; |
4 | -import 'package:flutter/services.dart'; | ||
5 | 4 | ||
6 | import '../modal_bottom_sheet.dart'; | 5 | import '../modal_bottom_sheet.dart'; |
7 | import 'bottom_sheet_route.dart'; | 6 | import 'bottom_sheet_route.dart'; |
8 | 7 | ||
9 | -class e extends PageRouteBuilder { | ||
10 | - | ||
11 | -} | ||
12 | - | ||
13 | class MaterialWithModalsPageRoute<T> extends MaterialPageRoute<T> { | 8 | class MaterialWithModalsPageRoute<T> extends MaterialPageRoute<T> { |
14 | /// Construct a MaterialPageRoute whose contents are defined by [builder]. | 9 | /// Construct a MaterialPageRoute whose contents are defined by [builder]. |
15 | /// | 10 | /// |
@@ -30,8 +25,6 @@ class MaterialWithModalsPageRoute<T> extends MaterialPageRoute<T> { | @@ -30,8 +25,6 @@ class MaterialWithModalsPageRoute<T> extends MaterialPageRoute<T> { | ||
30 | builder: builder, | 25 | builder: builder, |
31 | maintainState: maintainState); | 26 | maintainState: maintainState); |
32 | 27 | ||
33 | - | ||
34 | - | ||
35 | ModalBottomSheetRoute _nextModalRoute; | 28 | ModalBottomSheetRoute _nextModalRoute; |
36 | 29 | ||
37 | @override | 30 | @override |
@@ -7,42 +7,42 @@ packages: | @@ -7,42 +7,42 @@ packages: | ||
7 | name: archive | 7 | name: archive |
8 | url: "https://pub.dartlang.org" | 8 | url: "https://pub.dartlang.org" |
9 | source: hosted | 9 | source: hosted |
10 | - version: "2.0.13" | 10 | + version: "2.0.11" |
11 | args: | 11 | args: |
12 | dependency: transitive | 12 | dependency: transitive |
13 | description: | 13 | description: |
14 | name: args | 14 | name: args |
15 | url: "https://pub.dartlang.org" | 15 | url: "https://pub.dartlang.org" |
16 | source: hosted | 16 | source: hosted |
17 | - version: "1.6.0" | 17 | + version: "1.5.2" |
18 | async: | 18 | async: |
19 | dependency: transitive | 19 | dependency: transitive |
20 | description: | 20 | description: |
21 | name: async | 21 | name: async |
22 | url: "https://pub.dartlang.org" | 22 | url: "https://pub.dartlang.org" |
23 | source: hosted | 23 | source: hosted |
24 | - version: "2.4.1" | 24 | + version: "2.4.0" |
25 | boolean_selector: | 25 | boolean_selector: |
26 | dependency: transitive | 26 | dependency: transitive |
27 | description: | 27 | description: |
28 | name: boolean_selector | 28 | name: boolean_selector |
29 | url: "https://pub.dartlang.org" | 29 | url: "https://pub.dartlang.org" |
30 | source: hosted | 30 | source: hosted |
31 | - version: "2.0.0" | 31 | + version: "1.0.5" |
32 | charcode: | 32 | charcode: |
33 | dependency: transitive | 33 | dependency: transitive |
34 | description: | 34 | description: |
35 | name: charcode | 35 | name: charcode |
36 | url: "https://pub.dartlang.org" | 36 | url: "https://pub.dartlang.org" |
37 | source: hosted | 37 | source: hosted |
38 | - version: "1.1.3" | 38 | + version: "1.1.2" |
39 | collection: | 39 | collection: |
40 | dependency: transitive | 40 | dependency: transitive |
41 | description: | 41 | description: |
42 | name: collection | 42 | name: collection |
43 | url: "https://pub.dartlang.org" | 43 | url: "https://pub.dartlang.org" |
44 | source: hosted | 44 | source: hosted |
45 | - version: "1.14.12" | 45 | + version: "1.14.11" |
46 | convert: | 46 | convert: |
47 | dependency: transitive | 47 | dependency: transitive |
48 | description: | 48 | description: |
@@ -56,7 +56,7 @@ packages: | @@ -56,7 +56,7 @@ packages: | ||
56 | name: crypto | 56 | name: crypto |
57 | url: "https://pub.dartlang.org" | 57 | url: "https://pub.dartlang.org" |
58 | source: hosted | 58 | source: hosted |
59 | - version: "2.1.4" | 59 | + version: "2.1.3" |
60 | flutter: | 60 | flutter: |
61 | dependency: "direct main" | 61 | dependency: "direct main" |
62 | description: flutter | 62 | description: flutter |
@@ -73,7 +73,7 @@ packages: | @@ -73,7 +73,7 @@ packages: | ||
73 | name: image | 73 | name: image |
74 | url: "https://pub.dartlang.org" | 74 | url: "https://pub.dartlang.org" |
75 | source: hosted | 75 | source: hosted |
76 | - version: "2.1.12" | 76 | + version: "2.1.4" |
77 | matcher: | 77 | matcher: |
78 | dependency: transitive | 78 | dependency: transitive |
79 | description: | 79 | description: |
@@ -95,6 +95,13 @@ packages: | @@ -95,6 +95,13 @@ packages: | ||
95 | url: "https://pub.dartlang.org" | 95 | url: "https://pub.dartlang.org" |
96 | source: hosted | 96 | source: hosted |
97 | version: "1.6.4" | 97 | version: "1.6.4" |
98 | + pedantic: | ||
99 | + dependency: transitive | ||
100 | + description: | ||
101 | + name: pedantic | ||
102 | + url: "https://pub.dartlang.org" | ||
103 | + source: hosted | ||
104 | + version: "1.8.0+1" | ||
98 | petitparser: | 105 | petitparser: |
99 | dependency: transitive | 106 | dependency: transitive |
100 | description: | 107 | description: |
@@ -108,7 +115,7 @@ packages: | @@ -108,7 +115,7 @@ packages: | ||
108 | name: quiver | 115 | name: quiver |
109 | url: "https://pub.dartlang.org" | 116 | url: "https://pub.dartlang.org" |
110 | source: hosted | 117 | source: hosted |
111 | - version: "2.1.3" | 118 | + version: "2.0.5" |
112 | sky_engine: | 119 | sky_engine: |
113 | dependency: transitive | 120 | dependency: transitive |
114 | description: flutter | 121 | description: flutter |
@@ -120,7 +127,7 @@ packages: | @@ -120,7 +127,7 @@ packages: | ||
120 | name: source_span | 127 | name: source_span |
121 | url: "https://pub.dartlang.org" | 128 | url: "https://pub.dartlang.org" |
122 | source: hosted | 129 | source: hosted |
123 | - version: "1.7.0" | 130 | + version: "1.5.5" |
124 | stack_trace: | 131 | stack_trace: |
125 | dependency: transitive | 132 | dependency: transitive |
126 | description: | 133 | description: |
@@ -155,7 +162,7 @@ packages: | @@ -155,7 +162,7 @@ packages: | ||
155 | name: test_api | 162 | name: test_api |
156 | url: "https://pub.dartlang.org" | 163 | url: "https://pub.dartlang.org" |
157 | source: hosted | 164 | source: hosted |
158 | - version: "0.2.15" | 165 | + version: "0.2.11" |
159 | typed_data: | 166 | typed_data: |
160 | dependency: transitive | 167 | dependency: transitive |
161 | description: | 168 | description: |
@@ -176,6 +183,6 @@ packages: | @@ -176,6 +183,6 @@ packages: | ||
176 | name: xml | 183 | name: xml |
177 | url: "https://pub.dartlang.org" | 184 | url: "https://pub.dartlang.org" |
178 | source: hosted | 185 | source: hosted |
179 | - version: "3.6.1" | 186 | + version: "3.5.0" |
180 | sdks: | 187 | sdks: |
181 | - dart: ">=2.7.0 <3.0.0" | 188 | + dart: ">=2.4.0 <3.0.0" |
1 | name: modal_bottom_sheet | 1 | name: modal_bottom_sheet |
2 | -description: 'Modal bottom sheets: Cupertino, Material, or build your own' | ||
3 | -version: 0.0.1 | ||
4 | -author: 'JB <git@jaimeblasco.com>' | 2 | +description: 'Create flutter advanced modal bottom sheets. Material, Cupertino or your own style' |
3 | +version: 0.1.3 | ||
5 | homepage: 'https://github.com/jamesblasco/modal_bottom_sheet' | 4 | homepage: 'https://github.com/jamesblasco/modal_bottom_sheet' |
6 | 5 | ||
7 | environment: | 6 | environment: |
8 | - sdk: ">=2.7.0 <3.0.0" | 7 | + sdk: ">=2.0.0 <3.0.0" |
8 | + flutter: ">=1.12.0 <2.0.0" | ||
9 | 9 | ||
10 | dependencies: | 10 | dependencies: |
11 | flutter: | 11 | flutter: |
-
Please register or login to post a comment