diff --git a/gallery/gallery/lib/studies/shrine/app.dart b/gallery/gallery/lib/studies/shrine/app.dart index f1bdef3e1..50ce57895 100644 --- a/gallery/gallery/lib/studies/shrine/app.dart +++ b/gallery/gallery/lib/studies/shrine/app.dart @@ -78,6 +78,18 @@ class _ShrineAppState extends State with TickerProviderStateMixin { ); } + // Closes the bottom sheet if it is open. + Future _onWillPop() async { + final status = _expandingController.status; + if (status == AnimationStatus.completed || + status == AnimationStatus.forward) { + _expandingController.reverse(); + return false; + } + + return true; + } + @override Widget build(BuildContext context) { final bool isDesktop = isDisplayDesktop(context); @@ -86,34 +98,37 @@ class _ShrineAppState extends State with TickerProviderStateMixin { return ScopedModel( model: _model, - child: MaterialApp( - navigatorKey: widget.navigatorKey, - title: 'Shrine', - debugShowCheckedModeBanner: false, - home: LayoutCache( - layouts: _layouts, - child: PageStatus( - menuController: _controller, - cartController: _expandingController, - child: HomePage( - backdrop: backdrop, - scrim: Scrim(controller: _expandingController), - expandingBottomSheet: ExpandingBottomSheet( - hideController: _controller, - expandingController: _expandingController, + child: WillPopScope( + onWillPop: _onWillPop, + child: MaterialApp( + navigatorKey: widget.navigatorKey, + title: 'Shrine', + debugShowCheckedModeBanner: false, + home: LayoutCache( + layouts: _layouts, + child: PageStatus( + menuController: _controller, + cartController: _expandingController, + child: HomePage( + backdrop: backdrop, + scrim: Scrim(controller: _expandingController), + expandingBottomSheet: ExpandingBottomSheet( + hideController: _controller, + expandingController: _expandingController, + ), ), ), ), + initialRoute: '/login', + onGenerateRoute: _getRoute, + theme: shrineTheme.copyWith( + platform: GalleryOptions.of(context).platform, + ), + // L10n settings. + localizationsDelegates: GalleryLocalizations.localizationsDelegates, + supportedLocales: GalleryLocalizations.supportedLocales, + locale: GalleryOptions.of(context).locale, ), - initialRoute: '/login', - onGenerateRoute: _getRoute, - theme: shrineTheme.copyWith( - platform: GalleryOptions.of(context).platform, - ), - // L10n settings. - localizationsDelegates: GalleryLocalizations.localizationsDelegates, - supportedLocales: GalleryLocalizations.supportedLocales, - locale: GalleryOptions.of(context).locale, ), ); } diff --git a/gallery/gallery/lib/studies/shrine/expanding_bottom_sheet.dart b/gallery/gallery/lib/studies/shrine/expanding_bottom_sheet.dart index 4601bb66b..2c54900a3 100644 --- a/gallery/gallery/lib/studies/shrine/expanding_bottom_sheet.dart +++ b/gallery/gallery/lib/studies/shrine/expanding_bottom_sheet.dart @@ -2,11 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:async'; import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; import 'package:scoped_model/scoped_model.dart'; @@ -51,11 +49,11 @@ double _paddedThumbnailHeight(BuildContext context) { } class ExpandingBottomSheet extends StatefulWidget { - const ExpandingBottomSheet( - {Key key, - @required this.hideController, - @required this.expandingController}) - : assert(hideController != null), + const ExpandingBottomSheet({ + Key key, + @required this.hideController, + @required this.expandingController, + }) : assert(hideController != null), assert(expandingController != null), super(key: key); @@ -551,18 +549,6 @@ class _ExpandingBottomSheetState extends State } } - // Closes the cart if the cart is open, otherwise exits the app (this should - // only be relevant for Android). - Future _onWillPop() async { - if (!_isOpen) { - await SystemNavigator.pop(); - return true; - } - - close(); - return true; - } - @override Widget build(BuildContext context) { return AnimatedSize( @@ -571,16 +557,13 @@ class _ExpandingBottomSheetState extends State curve: Curves.easeInOut, vsync: this, alignment: AlignmentDirectional.topStart, - child: WillPopScope( - onWillPop: _onWillPop, - child: AnimatedBuilder( - animation: widget.hideController, - builder: (context, child) => AnimatedBuilder( - animation: widget.expandingController, - builder: (context, child) => ScopedModelDescendant( - builder: (context, child, model) => - _buildSlideAnimation(context, _buildCart(context)), - ), + child: AnimatedBuilder( + animation: widget.hideController, + builder: (context, child) => AnimatedBuilder( + animation: widget.expandingController, + builder: (context, child) => ScopedModelDescendant( + builder: (context, child, model) => + _buildSlideAnimation(context, _buildCart(context)), ), ), ),