From 4a094de2903c511a8bdb4a91fb01de1faa1fd993 Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Mon, 29 Oct 2018 19:44:00 -0700 Subject: [PATCH] [H] Cleanup (#23632) * Avoid abbreviations * Sample code for AppBar.leading * Add a test for OverflowBox/FractionallySizedBox * Minor wording improvements in the text. The words "note that" here don't really contribute to the flow. --- dev/bots/prepare_package.dart | 24 +++++++-------- .../flutter/lib/src/material/app_bar.dart | 30 +++++++++++++++++++ .../flutter/lib/src/widgets/scroll_view.dart | 10 +++---- .../widgets/fractionally_sized_box_test.dart | 26 ++++++++++++++++ .../test/android/android_studio_test.dart | 3 +- .../android_studio_validator_test.dart | 3 +- 6 files changed, 77 insertions(+), 19 deletions(-) diff --git a/dev/bots/prepare_package.dart b/dev/bots/prepare_package.dart index ec7f52fb482..34464a974b4 100644 --- a/dev/bots/prepare_package.dart +++ b/dev/bots/prepare_package.dart @@ -569,7 +569,7 @@ class ArchivePublisher { /// /// Archives contain the executables and customizations for the platform that /// they are created on. -Future main(List argList) async { +Future main(List rawArguments) async { final ArgParser argParser = ArgParser(); argParser.addOption( 'temp_dir', @@ -612,9 +612,9 @@ Future main(List argList) async { help: 'Print help for this command.', ); - final ArgResults args = argParser.parse(argList); + final ArgResults parsedArguments = argParser.parse(rawArguments); - if (args['help']) { + if (parsedArguments['help']) { print(argParser.usage); exit(0); } @@ -625,7 +625,7 @@ Future main(List argList) async { exit(exitCode); } - final String revision = args['revision']; + final String revision = parsedArguments['revision']; if (revision.isEmpty) { errorExit('Invalid argument: --revision must be specified.'); } @@ -633,40 +633,40 @@ Future main(List argList) async { errorExit('Invalid argument: --revision must be the entire hash, not just a prefix.'); } - if (args['branch'].isEmpty) { + if (parsedArguments['branch'].isEmpty) { errorExit('Invalid argument: --branch must be specified.'); } Directory tempDir; bool removeTempDir = false; - if (args['temp_dir'] == null || args['temp_dir'].isEmpty) { + if (parsedArguments['temp_dir'] == null || parsedArguments['temp_dir'].isEmpty) { tempDir = Directory.systemTemp.createTempSync('flutter_package.'); removeTempDir = true; } else { - tempDir = Directory(args['temp_dir']); + tempDir = Directory(parsedArguments['temp_dir']); if (!tempDir.existsSync()) { - errorExit("Temporary directory ${args['temp_dir']} doesn't exist."); + errorExit("Temporary directory ${parsedArguments['temp_dir']} doesn't exist."); } } Directory outputDir; - if (args['output'] == null) { + if (parsedArguments['output'] == null) { outputDir = tempDir; } else { - outputDir = Directory(args['output']); + outputDir = Directory(parsedArguments['output']); if (!outputDir.existsSync()) { outputDir.createSync(recursive: true); } } - final Branch branch = fromBranchName(args['branch']); + final Branch branch = fromBranchName(parsedArguments['branch']); final ArchiveCreator creator = ArchiveCreator(tempDir, outputDir, revision, branch); int exitCode = 0; String message; try { final String version = await creator.initializeRepo(); final File outputFile = await creator.createArchive(); - if (args['publish']) { + if (parsedArguments['publish']) { final ArchivePublisher publisher = ArchivePublisher( tempDir, revision, diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index b3883aede90..f535d11e2b0 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -168,6 +168,36 @@ class AppBar extends StatefulWidget implements PreferredSizeWidget { /// widget with an [IconButton] that opens the drawer (using [Icons.menu]). If /// there's no [Drawer] and the parent [Navigator] can go back, the [AppBar] /// will use a [BackButton] that calls [Navigator.maybePop]. + /// + /// ## Sample code + /// + /// The following code shows how the drawer button could be manually specified + /// instead of relying on [automaticallyImplyLeading]: + /// + /// ```dart + /// AppBar( + /// leading: Builder( + /// builder: (BuildContext context) { + /// return IconButton( + /// icon: const Icon(Icons.menu), + /// onPressed: () { Scaffold.of(context).openDrawer(); }, + /// tooltip: MaterialLocalizations.of(context).openAppDrawerTooltip, + /// ); + /// }, + /// ), + /// ) + /// ``` + /// + /// The [Builder] is used in this example to ensure that the `context` refers + /// to that part of the subtree. That way this code snippet can be used even + /// inside the very code that is creating the [Scaffold] (in which case, + /// without the [Builder], the `context` wouldn't be able to see the + /// [Scaffold], since it would refer to an ancestor of that widget). + /// + /// See also: + /// + /// * [Scaffold.appBar], in which an [AppBar] is usually placed. + /// * [Scaffold.drawer], in which the [Drawer] is usually placed. final Widget leading; /// Controls whether we should try to imply the leading widget if null. diff --git a/packages/flutter/lib/src/widgets/scroll_view.dart b/packages/flutter/lib/src/widgets/scroll_view.dart index 85a7260b24e..4225732c0da 100644 --- a/packages/flutter/lib/src/widgets/scroll_view.dart +++ b/packages/flutter/lib/src/widgets/scroll_view.dart @@ -355,14 +355,14 @@ abstract class ScrollView extends StatelessWidget { /// generated semantics of each scrollable item with a semantic index. This can /// be done by wrapping the child widgets in an [IndexedSemantics]. /// -/// This semantic index is not necesarily the same as the index of the widget -/// in the scrollable, because some widgets may not contribute semantic -/// information. Consider a [new ListView.separated()], every other widget is a +/// This semantic index is not necesarily the same as the index of the widget in +/// the scrollable, because some widgets may not contribute semantic +/// information. Consider a [new ListView.separated()]: every other widget is a /// divider with no semantic information. In this case, only odd numbered /// widgets have a semantic index (equal to the index ~/ 2). Furthermore, the /// total number of children in this example would be half the number of -/// widgets. Note that [new ListView.separated()] handles this automatically -/// and is only used here as an example. +/// widgets. (The [new ListView.separated()] constructor handles this +/// automatically; this is only used here as an example.) /// /// The total number of visible children can be provided by the constructor /// parameter `semanticChildCount`. This should always be the same as the diff --git a/packages/flutter/test/widgets/fractionally_sized_box_test.dart b/packages/flutter/test/widgets/fractionally_sized_box_test.dart index 006572e71cb..b0579d745ea 100644 --- a/packages/flutter/test/widgets/fractionally_sized_box_test.dart +++ b/packages/flutter/test/widgets/fractionally_sized_box_test.dart @@ -61,4 +61,30 @@ void main() { expect(box.size, equals(const Size(400.0, 300.0))); expect(box.localToGlobal(box.size.center(Offset.zero)), equals(const Offset(0.0 + 400.0 / 2.0, 0.0 + 300.0 / 2.0))); }); + + testWidgets('OverflowBox alignment with FractionallySizedBox', (WidgetTester tester) async { + final GlobalKey inner = GlobalKey(); + await tester.pumpWidget(Directionality( + textDirection: TextDirection.rtl, + child: OverflowBox( + minWidth: 0.0, + maxWidth: 100.0, + minHeight: 0.0, + maxHeight: 100.0, + alignment: const AlignmentDirectional(1.0, -1.0), + child: Center( + child: FractionallySizedBox( + widthFactor: 0.5, + heightFactor: 0.25, + child: Container( + key: inner + ), + ), + ), + ), + )); + final RenderBox box = inner.currentContext.findRenderObject(); + expect(box.size, equals(const Size(50.0, 25.0))); + expect(box.localToGlobal(Offset.zero), equals(const Offset(25.0, 37.5))); + }); } diff --git a/packages/flutter_tools/test/android/android_studio_test.dart b/packages/flutter_tools/test/android/android_studio_test.dart index 02729926e4a..20ba39cb09f 100644 --- a/packages/flutter_tools/test/android/android_studio_test.dart +++ b/packages/flutter_tools/test/android/android_studio_test.dart @@ -41,7 +41,8 @@ void main() { equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins')); }, overrides: { FileSystem: () => fs, - // Note that custom home paths are not supported on macOS nor Windows yet: + // Custom home paths are not supported on macOS nor Windows yet, + // so we force the platform to fake Linux here. Platform: () => linuxPlatform(), }); }); diff --git a/packages/flutter_tools/test/android/android_studio_validator_test.dart b/packages/flutter_tools/test/android/android_studio_validator_test.dart index 3fe1849d28d..138996e274f 100644 --- a/packages/flutter_tools/test/android/android_studio_validator_test.dart +++ b/packages/flutter_tools/test/android/android_studio_validator_test.dart @@ -23,7 +23,8 @@ void main() { final NoAndroidStudioValidator validator = NoAndroidStudioValidator(); expect((await validator.validate()).type, equals(ValidationType.notAvailable)); }, overrides: { - // Note that custom home paths are not supported on macOS nor Windows yet: + // Custom home paths are not supported on macOS nor Windows yet, + // so we force the platform to fake Linux here. Platform: () => linuxPlatform(), }); });