Jaime Blasco
Committed by GitHub

Merge pull request #22 from jamesblasco/small_bug_fixes

Small bug fixes
@@ -18,7 +18,7 @@ class ModalInsideModal extends StatelessWidget { @@ -18,7 +18,7 @@ class ModalInsideModal extends StatelessWidget {
18 child: ListView( 18 child: ListView(
19 shrinkWrap: true, 19 shrinkWrap: true,
20 controller: scrollController, 20 controller: scrollController,
21 - physics: BouncingScrollPhysics(), 21 + physics: ClampingScrollPhysics(),
22 children: ListTile.divideTiles( 22 children: ListTile.divideTiles(
23 context: context, 23 context: context,
24 tiles: List.generate( 24 tiles: List.generate(
@@ -13,7 +13,7 @@ import 'package:flutter/widgets.dart'; @@ -13,7 +13,7 @@ import 'package:flutter/widgets.dart';
13 13
14 const Duration _bottomSheetDuration = Duration(milliseconds: 400); 14 const Duration _bottomSheetDuration = Duration(milliseconds: 400);
15 const double _minFlingVelocity = 500.0; 15 const double _minFlingVelocity = 500.0;
16 -const double _closeProgressThreshold = 0.5; 16 +const double _closeProgressThreshold = 0.6;
17 const double _willPopThreshold = 0.8; 17 const double _willPopThreshold = 0.8;
18 18
19 typedef ScrollWidgetBuilder = Widget Function( 19 typedef ScrollWidgetBuilder = Widget Function(
@@ -243,14 +243,30 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -243,14 +243,30 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
243 243
244 void _handleScrollUpdate(ScrollNotification notification) { 244 void _handleScrollUpdate(ScrollNotification notification) {
245 if (notification.metrics.pixels <= notification.metrics.minScrollExtent) { 245 if (notification.metrics.pixels <= notification.metrics.minScrollExtent) {
246 - //Check if listener is same from scrollController  
247 if (!_scrollController.hasClients) return; 246 if (!_scrollController.hasClients) return;
248 247
249 - if (_scrollController.position.pixels != notification.metrics.pixels) { 248 + // Check if listener is same from scrollController.
  249 + // TODO: Improve the way it checks if it the same view controller
  250 + // Use PrimaryScrollController
  251 + if (_scrollController.position.pixels != notification.metrics.pixels &&
  252 + !(_scrollController.position.pixels == 0 &&
  253 + notification.metrics.pixels >= 0)) {
250 return; 254 return;
251 } 255 }
  256 + // Clamping Scroll Physics end with a ScrollEndNotification with a DragEndDetail class
  257 + // while Bouncing Scroll Physics or other physics that Overflow don't return a drag end info
  258 +
  259 + // We use the velocity from DragEndDetail in case it is available
  260 + if (notification is ScrollEndNotification &&
  261 + notification.dragDetails != null) {
  262 + _handleDragEnd(notification.dragDetails.primaryVelocity);
  263 + _velocityTracker = null;
  264 + _startTime = null;
  265 + return;
  266 + }
  267 + // Otherwise the calculate the velocity with a VelocityTracker
252 DragUpdateDetails dragDetails; 268 DragUpdateDetails dragDetails;
253 - if (notification is ScrollStartNotification) { 269 + if (_velocityTracker == null) {
254 _velocityTracker = VelocityTracker(); 270 _velocityTracker = VelocityTracker();
255 _startTime = DateTime.now(); 271 _startTime = DateTime.now();
256 } 272 }
@@ -262,11 +278,13 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -262,11 +278,13 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
262 } 278 }
263 if (dragDetails != null) { 279 if (dragDetails != null) {
264 final duration = _startTime.difference(DateTime.now()); 280 final duration = _startTime.difference(DateTime.now());
265 - final offset = Offset(0, _scrollController.offset); 281 + final offset = Offset(0, notification.metrics.pixels);
266 _velocityTracker.addPosition(duration, offset); 282 _velocityTracker.addPosition(duration, offset);
267 _handleDragUpdate(dragDetails.primaryDelta); 283 _handleDragUpdate(dragDetails.primaryDelta);
268 } else if (isDragging) { 284 } else if (isDragging) {
269 final velocity = _velocityTracker.getVelocity().pixelsPerSecond.dy; 285 final velocity = _velocityTracker.getVelocity().pixelsPerSecond.dy;
  286 + _velocityTracker = null;
  287 + _startTime = null;
270 _handleDragEnd(velocity); 288 _handleDragEnd(velocity);
271 } 289 }
272 } 290 }
@@ -285,7 +303,7 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -285,7 +303,7 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
285 Widget build(BuildContext context) { 303 Widget build(BuildContext context) {
286 final bounceAnimation = CurvedAnimation( 304 final bounceAnimation = CurvedAnimation(
287 parent: _bounceDragController, 305 parent: _bounceDragController,
288 - curve: widget.animationCurve ?? Curves.easeOutSine, 306 + curve: Curves.easeOutSine,
289 ); 307 );
290 308
291 var child = widget.builder(context, _scrollController); 309 var child = widget.builder(context, _scrollController);
@@ -299,17 +317,17 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -299,17 +317,17 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
299 } 317 }
300 318
301 // Todo: Add curved Animation when push and pop without gesture 319 // Todo: Add curved Animation when push and pop without gesture
302 - /* final Animation<double> containerAnimation = CurvedAnimation( 320 + final Animation<double> containerAnimation = CurvedAnimation(
303 parent: widget.animationController, 321 parent: widget.animationController,
304 - curve: Curves.easeOut,  
305 - );*/ 322 + curve: widget.animationCurve ?? Curves.linear,
  323 + );
306 324
307 return AnimatedBuilder( 325 return AnimatedBuilder(
308 animation: widget.animationController, 326 animation: widget.animationController,
309 builder: (context, _) => ClipRect( 327 builder: (context, _) => ClipRect(
310 child: CustomSingleChildLayout( 328 child: CustomSingleChildLayout(
311 delegate: _ModalBottomSheetLayout( 329 delegate: _ModalBottomSheetLayout(
312 - widget.animationController.value, widget.expanded), 330 + containerAnimation.value, widget.expanded),
313 child: !widget.enableDrag 331 child: !widget.enableDrag
314 ? child 332 ? child
315 : KeyedSubtree( 333 : KeyedSubtree(