Make drawer demo header not scroll away (#13337) * Make drawer demo header not scroll * Add test for gallery drawer demo and fix user accounts drawer header overflow
diff --git a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj index dbff9d2..21acc356 100644 --- a/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj +++ b/examples/flutter_gallery/ios/Runner.xcodeproj/project.pbxproj
@@ -276,12 +276,18 @@ inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${PODS_ROOT}/../../../../bin/cache/artifacts/engine/ios/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", + "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", + "${BUILT_PRODUCTS_DIR}/video_player/video_player.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/video_player.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -508,4 +514,4 @@ /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; -} \ No newline at end of file +}
diff --git a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart index f35f1b0..7eaa46c 100644 --- a/examples/flutter_gallery/lib/demo/material/drawer_demo.dart +++ b/examples/flutter_gallery/lib/demo/material/drawer_demo.dart
@@ -89,7 +89,7 @@ title: const Text('Navigation drawer'), ), drawer: new Drawer( - child: new ListView( + child: new Column( children: <Widget>[ new UserAccountsDrawerHeader( accountName: const Text('Zach Widget'), @@ -114,6 +114,7 @@ ), ), ], + margin: EdgeInsets.zero, onDetailsPressed: () { _showDrawerContents = !_showDrawerContents; if (_showDrawerContents) @@ -122,48 +123,58 @@ _controller.forward(); }, ), - new ClipRect( - child: new Stack( - children: <Widget>[ - // The initial contents of the drawer. - new FadeTransition( - opacity: _drawerContentsOpacity, - child: new Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: _drawerContents.map((String id) { - return new ListTile( - leading: new CircleAvatar(child: new Text(id)), - title: new Text('Drawer item $id'), - onTap: _showNotImplementedMessage, - ); - }).toList(), - ), - ), - // The drawer's "details" view. - new SlideTransition( - position: _drawerDetailsPosition, - child: new FadeTransition( - opacity: new ReverseAnimation(_drawerContentsOpacity), - child: new Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: <Widget>[ - new ListTile( - leading: const Icon(Icons.add), - title: const Text('Add account'), - onTap: _showNotImplementedMessage, + new MediaQuery.removePadding( + context: context, + // DrawerHeader consumes top MediaQuery padding. + removeTop: true, + child: new Expanded( + child: new ListView( + padding: const EdgeInsets.only(top: 8.0), + children: <Widget>[ + new Stack( + children: <Widget>[ + // The initial contents of the drawer. + new FadeTransition( + opacity: _drawerContentsOpacity, + child: new Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: _drawerContents.map((String id) { + return new ListTile( + leading: new CircleAvatar(child: new Text(id)), + title: new Text('Drawer item $id'), + onTap: _showNotImplementedMessage, + ); + }).toList(), ), - new ListTile( - leading: const Icon(Icons.settings), - title: const Text('Manage accounts'), - onTap: _showNotImplementedMessage, + ), + // The drawer's "details" view. + new SlideTransition( + position: _drawerDetailsPosition, + child: new FadeTransition( + opacity: new ReverseAnimation(_drawerContentsOpacity), + child: new Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: <Widget>[ + new ListTile( + leading: const Icon(Icons.add), + title: const Text('Add account'), + onTap: _showNotImplementedMessage, + ), + new ListTile( + leading: const Icon(Icons.settings), + title: const Text('Manage accounts'), + onTap: _showNotImplementedMessage, + ), + ], + ), ), - ], - ), + ), + ], ), - ), - ], + ], + ), ), ), ],
diff --git a/examples/flutter_gallery/test/demo/material/drawer_demo_test.dart b/examples/flutter_gallery/test/demo/material/drawer_demo_test.dart new file mode 100644 index 0000000..eb3545b --- /dev/null +++ b/examples/flutter_gallery/test/demo/material/drawer_demo_test.dart
@@ -0,0 +1,31 @@ +// Copyright 2017 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 'package:flutter_gallery/demo/material/drawer_demo.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('Drawer header does not scroll', (WidgetTester tester) async { + await tester.pumpWidget(new MaterialApp( + theme: new ThemeData(platform: TargetPlatform.iOS), + home: new DrawerDemo(), + )); + + await tester.tap(find.text('Tap here to open the drawer')); + await tester.pump(); + await tester.pump(const Duration(milliseconds: 500)); + + expect(tester.getTopLeft(find.byType(UserAccountsDrawerHeader)).dy, 0.0); + final double initialTopItemSaneY = tester.getTopLeft(find.text('Drawer item A')).dy; + expect(initialTopItemSaneY, greaterThan(0.0)); + + await tester.drag(find.text('Drawer item B'), const Offset(0.0, 400.0)); + await tester.pump(); + + expect(tester.getTopLeft(find.byType(UserAccountsDrawerHeader)).dy, 0.0); + expect(tester.getTopLeft(find.text('Drawer item A')).dy, greaterThan(initialTopItemSaneY)); + expect(tester.getTopLeft(find.text('Drawer item A')).dy, lessThanOrEqualTo(initialTopItemSaneY + 400.0)); + }); +}