diff --git a/dev/bots/test.dart b/dev/bots/test.dart index 3de74c6539..84ba99a81e 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -613,7 +613,6 @@ Future _runFrameworkTests() async { await _runFlutterTest(path.join(flutterRoot, 'dev', 'integration_tests', 'android_semantics_testing'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'manual_tests'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'tools', 'vitool'), tableData: bigqueryApi?.tabledata); - await _runFlutterTest(path.join(flutterRoot, 'examples', 'catalog'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'examples', 'hello_world'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'examples', 'layers'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'benchmarks', 'test_apps', 'stocks'), tableData: bigqueryApi?.tabledata); diff --git a/examples/catalog/README.md b/examples/catalog/README.md deleted file mode 100644 index 69848daf43..0000000000 --- a/examples/catalog/README.md +++ /dev/null @@ -1,39 +0,0 @@ -Samples Catalog -======= - -A collection of sample apps that demonstrate how Flutter can be used. - -Each sample app is contained in a single `.dart` file located in the `lib` -directory. To run each sample app, specify the corresponding file on the -`flutter run` command line, for example: - -``` -flutter run lib/animated_list.dart -flutter run lib/app_bar_bottom.dart -flutter run lib/basic_app_bar.dart -... -``` - -The apps are intended to be short and easily understood. Classes that represent -the sample's focus are at the top of the file; data and support classes follow. - -Each sample app contains a comment (usually at the end) which provides some -standard documentation that also appears in the web view of the catalog. -See the "Generating..." section below. - -Generating the web view of the catalog ---------- - -Markdown and a screenshot of each app are produced by `bin/sample_page.dart` -and saved in the `.generated` directory. The markdown file contains -the text taken from the Sample Catalog comment found in the app's source -file, followed by the source code itself. - -This `sample_page.dart` command-line app must be run from the `examples/catalog` -directory. It relies on templates also found in the bin directory, and it -generates and executes `test_driver` apps to collect the screenshots: - -``` -cd examples/catalog -dart bin/sample_page.dart -``` diff --git a/examples/catalog/android/app/build.gradle b/examples/catalog/android/app/build.gradle deleted file mode 100644 index 852e5cd949..0000000000 --- a/examples/catalog/android/app/build.gradle +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 29 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId "io.flutter.examples.catalog" - minSdkVersion 16 - targetSdkVersion 29 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} diff --git a/examples/catalog/android/app/src/main/AndroidManifest.xml b/examples/catalog/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index e25ddbe7c7..0000000000 --- a/examples/catalog/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/examples/catalog/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/catalog/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b..0000000000 Binary files a/examples/catalog/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/examples/catalog/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/catalog/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb..0000000000 Binary files a/examples/catalog/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/examples/catalog/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/catalog/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391482..0000000000 Binary files a/examples/catalog/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/catalog/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/catalog/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e..0000000000 Binary files a/examples/catalog/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/catalog/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/catalog/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebd..0000000000 Binary files a/examples/catalog/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/examples/catalog/android/build.gradle b/examples/catalog/android/build.gradle deleted file mode 100644 index 5df71fcf8b..0000000000 --- a/examples/catalog/android/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/examples/catalog/android/gradle.properties b/examples/catalog/android/gradle.properties deleted file mode 100644 index a6738207fd..0000000000 --- a/examples/catalog/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true diff --git a/examples/catalog/android/gradle/wrapper/gradle-wrapper.properties b/examples/catalog/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 296b146b73..0000000000 --- a/examples/catalog/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/examples/catalog/android/settings.gradle b/examples/catalog/android/settings.gradle deleted file mode 100644 index d3b6a4013d..0000000000 --- a/examples/catalog/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -include ':app' - -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/examples/catalog/bin/class_index.md.template b/examples/catalog/bin/class_index.md.template deleted file mode 100644 index 7411af3ba0..0000000000 --- a/examples/catalog/bin/class_index.md.template +++ /dev/null @@ -1,11 +0,0 @@ ---- -layout: page -title: "@(class) Sample Apps" -permalink: /catalog/samples/@(link)/ ---- - -All of the sample apps listed here use the Flutter @(class) class in an interesting way. The Sample App Catalog page lists all of the sample apps. - -
-@(entries) -
diff --git a/examples/catalog/bin/entry.md.template b/examples/catalog/bin/entry.md.template deleted file mode 100644 index 33bd322cc4..0000000000 --- a/examples/catalog/bin/entry.md.template +++ /dev/null @@ -1,18 +0,0 @@ -
- -
- Android screenshot -
-
-
-

- @(summary) -

-

- This app features the following classes: @(classes). -

-

- Learn more. -

-
-
diff --git a/examples/catalog/bin/index.md.template b/examples/catalog/bin/index.md.template deleted file mode 100644 index a10d905ad7..0000000000 --- a/examples/catalog/bin/index.md.template +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: page -title: "Sample App Catalog" -permalink: /catalog/samples/ ---- - -This catalog lists applications that demonstrate how to implement common mobile design patterns with Flutter. Each sample demonstrates how a few Flutter widgets can be put together to implement a meaningful user interface. The samples are short - just one Dart file - but they're complete applications. They should be easy to try out and tweak with your favorite IDE/code editor. - -If there are other sample apps that you'd like to see we'd appreciate hearing from you on our [Gitter channel](https://gitter.im/flutter/flutter) or [mailing list](https://groups.google.com/d/forum/flutter-dev). - -
-@(entries) -
diff --git a/examples/catalog/bin/sample_page.dart b/examples/catalog/bin/sample_page.dart deleted file mode 100644 index 6e1ae655a3..0000000000 --- a/examples/catalog/bin/sample_page.dart +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2014 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This application generates markdown pages and screenshots for each -// sample app. For more information see ../README.md. - -import 'dart:io'; - -import 'package:path/path.dart'; - -class SampleError extends Error { - SampleError(this.message); - final String message; - @override - String toString() => 'SampleError($message)'; -} - -// Sample apps are .dart files in the lib directory which contain a block -// comment that begins with a '/* Sample Catalog' line, and ends with a line -// that just contains '*/'. The following keywords may appear at the -// beginning of lines within the comment. A keyword's value is all of -// the following text up to the next keyword or the end of the comment, -// sans leading and trailing whitespace. -const String sampleCatalogKeywords = r'^Title:|^Summary:|^Description:|^Classes:|^Sample:|^See also:'; - -Directory outputDirectory; -Directory sampleDirectory; -Directory testDirectory; -Directory driverDirectory; - -void logMessage(String s) { print(s); } -void logError(String s) { print(s); } - -File inputFile(String dir, String name) { - return File(dir + Platform.pathSeparator + name); -} - -File outputFile(String name, [Directory directory]) { - return File((directory ?? outputDirectory).path + Platform.pathSeparator + name); -} - -void initialize() { - outputDirectory = Directory('.generated'); - sampleDirectory = Directory('lib'); - testDirectory = Directory('test'); - driverDirectory = Directory('test_driver'); - outputDirectory.createSync(); -} - -// Return a copy of template with each occurrence of @(foo) replaced -// by values[foo]. -String expandTemplate(String template, Map values) { - // Matches @(foo), match[1] == 'foo' - final RegExp tokenRE = RegExp(r'@\(([\w ]+)\)', multiLine: true); - return template.replaceAllMapped(tokenRE, (Match match) { - if (match.groupCount != 1) - throw SampleError('bad template keyword $match[0]'); - final String keyword = match[1]; - return values[keyword] ?? ''; - }); -} - -void writeExpandedTemplate(File output, String template, Map values) { - output.writeAsStringSync(expandTemplate(template, values)); - logMessage('wrote $output'); -} - -class SampleInfo { - SampleInfo(this.sourceFile, this.commit); - - final File sourceFile; - final String commit; - String sourceCode; - Map commentValues; - - // If sourceFile is lib/foo.dart then sourceName is foo. The sourceName - // is used to create derived filenames like foo.md or foo.png. - String get sourceName => basenameWithoutExtension(sourceFile.path); - - // The website's link to this page will be /catalog/samples/@(link)/. - String get link => sourceName.replaceAll('_', '-'); - - // The name of the widget class that defines this sample app, like 'FooSample'. - String get sampleClass => commentValues['sample']; - - // The value of the 'Classes:' comment as a list of class names. - Iterable get highlightedClasses { - final String classNames = commentValues['classes']; - if (classNames == null) - return const []; - return classNames.split(',').map((String s) => s.trim()).where((String s) => s.isNotEmpty); - } - - // The relative import path for this sample, like '../lib/foo.dart'. - String get importPath => '..' + Platform.pathSeparator + sourceFile.path; - - // Return true if we're able to find the "Sample Catalog" comment in the - // sourceFile, and we're able to load its keyword/value pairs into - // the commentValues Map. The rest of the file's contents are saved - // in sourceCode. - bool initialize() { - final String contents = sourceFile.readAsStringSync(); - - final RegExp startRE = RegExp(r'^/\*\s+^Sample\s+Catalog', multiLine: true); - final RegExp endRE = RegExp(r'^\*/', multiLine: true); - final Match startMatch = startRE.firstMatch(contents); - if (startMatch == null) - return false; - - final int startIndex = startMatch.end; - final Match endMatch = endRE.firstMatch(contents.substring(startIndex)); - if (endMatch == null) - return false; - - final String comment = contents.substring(startIndex, startIndex + endMatch.start); - sourceCode = contents.substring(0, startMatch.start) + contents.substring(startIndex + endMatch.end); - if (sourceCode.trim().isEmpty) - throw SampleError('did not find any source code in $sourceFile'); - - final RegExp keywordsRE = RegExp(sampleCatalogKeywords, multiLine: true); - final List keywordMatches = keywordsRE.allMatches(comment).toList(); - if (keywordMatches.isEmpty) - throw SampleError('did not find any keywords in the Sample Catalog comment in $sourceFile'); - - commentValues = {}; - for (int i = 0; i < keywordMatches.length; i += 1) { - final String keyword = comment.substring(keywordMatches[i].start, keywordMatches[i].end - 1); - final String value = comment.substring( - keywordMatches[i].end, - i == keywordMatches.length - 1 ? null : keywordMatches[i + 1].start, - ); - commentValues[keyword.toLowerCase()] = value.trim(); - } - commentValues['name'] = sourceName; - commentValues['path'] = 'examples/catalog/${sourceFile.path}'; - commentValues['source'] = sourceCode.trim(); - commentValues['link'] = link; - commentValues['android screenshot'] = 'https://storage.googleapis.com/flutter-catalog/$commit/${sourceName}_small.png'; - - return true; - } -} - -void generate(String commit) { - initialize(); - - final List samples = []; - for (final FileSystemEntity entity in sampleDirectory.listSync()) { - if (entity is File && entity.path.endsWith('.dart')) { - final SampleInfo sample = SampleInfo(entity, commit); - if (sample.initialize()) // skip files that lack the Sample Catalog comment - samples.add(sample); - } - } - - // Causes the generated imports to appear in alphabetical order. - // Avoid complaints from flutter lint. - samples.sort((SampleInfo a, SampleInfo b) { - return a.sourceName.compareTo(b.sourceName); - }); - - final String entryTemplate = inputFile('bin', 'entry.md.template').readAsStringSync(); - - // Write the sample catalog's home page: index.md - final Iterable entries = samples.map((SampleInfo sample) { - return expandTemplate(entryTemplate, sample.commentValues); - }); - writeExpandedTemplate( - outputFile('index.md'), - inputFile('bin', 'index.md.template').readAsStringSync(), - { - 'entries': entries.join('\n'), - }, - ); - - // Write the sample app files, like animated_list.md - for (final SampleInfo sample in samples) { - writeExpandedTemplate( - outputFile(sample.sourceName + '.md'), - inputFile('bin', 'sample_page.md.template').readAsStringSync(), - sample.commentValues, - ); - } - - // For each unique class listened in a sample app's "Classes:" list, generate - // a file that's structurally the same as index.md but only contains samples - // that feature one class. For example AnimatedList_index.md would only - // include samples that had AnimatedList in their "Classes:" list. - final Map> classToSamples = >{}; - for (final SampleInfo sample in samples) { - for (final String className in sample.highlightedClasses) { - classToSamples[className] ??= []; - classToSamples[className].add(sample); - } - } - for (final String className in classToSamples.keys) { - final Iterable entries = classToSamples[className].map((SampleInfo sample) { - return expandTemplate(entryTemplate, sample.commentValues); - }); - writeExpandedTemplate( - outputFile('${className}_index.md'), - inputFile('bin', 'class_index.md.template').readAsStringSync(), - { - 'class': className, - 'entries': entries.join('\n'), - 'link': '${className}_index', - }, - ); - } - - // Write screenshot.dart, a "test" app that displays each sample - // app in turn when the app is tapped. - writeExpandedTemplate( - outputFile('screenshot.dart', driverDirectory), - inputFile('bin', 'screenshot.dart.template').readAsStringSync(), - { - 'imports': samples.map((SampleInfo page) { - return "import '${page.importPath}' show ${page.sampleClass};\n"; - }).join(), - 'widgets': samples.map((SampleInfo sample) { - return 'new ${sample.sampleClass}(),\n'; - }).join(), - }, - ); - - // Write screenshot_test.dart, a test driver for screenshot.dart - // that collects screenshots of each app and saves them. - writeExpandedTemplate( - outputFile('screenshot_test.dart', driverDirectory), - inputFile('bin', 'screenshot_test.dart.template').readAsStringSync(), - { - 'paths': samples.map((SampleInfo sample) { - return "'${outputFile(sample.sourceName + '.png').path}'"; - }).join(',\n'), - }, - ); - - // For now, the website's index.json file must be updated by hand. - logMessage('The following entries must appear in _data/catalog/widgets.json'); - for (final String className in classToSamples.keys) - logMessage('"sample": "${className}_index"'); -} - -void main(List args) { - if (args.length != 1) { - logError( - 'Usage (cd examples/catalog/; dart bin/sample_page.dart commit)\n' - 'The flutter commit hash locates screenshots on storage.googleapis.com/flutter-catalog/' - ); - exit(255); - } - try { - generate(args[0]); - } catch (error) { - logError( - 'Error: sample_page.dart failed: $error\n' - 'This sample_page.dart app expects to be run from the examples/catalog directory. ' - 'More information can be found in examples/catalog/README.md.' - ); - exit(255); - } - exit(0); -} diff --git a/examples/catalog/bin/sample_page.md.template b/examples/catalog/bin/sample_page.md.template deleted file mode 100644 index f9470caf65..0000000000 --- a/examples/catalog/bin/sample_page.md.template +++ /dev/null @@ -1,36 +0,0 @@ ---- -layout: page -title: "@(title)" -permalink: /catalog/samples/@(link)/ ---- - -@(summary) - -

-

-
-
-
-
- Android screenshot -
- -
-
-
-
-

- -@(description) - -Try this app out by creating a new project with `flutter create` and replacing the contents of `lib/main.dart` with the code that follows. - -```dart -@(source) -``` - -

See also:

-@(see also) -- The source code in [@(path)](https://github.com/flutter/flutter/blob/master/@(path)). diff --git a/examples/catalog/bin/screenshot.dart.template b/examples/catalog/bin/screenshot.dart.template deleted file mode 100644 index 4e8c57909a..0000000000 --- a/examples/catalog/bin/screenshot.dart.template +++ /dev/null @@ -1,41 +0,0 @@ -// This file was generated using bin/screenshot.dart.template and -// bin/sample_page.dart. For more information see README.md. - -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter/material.dart'; - -@(imports) - -class SampleScreenshots extends StatefulWidget { - @override - SampleScreenshotsState createState() => new SampleScreenshotsState(); -} - -class SampleScreenshotsState extends State { - final List samples = [ - @(widgets) - ]; - int sampleIndex = 0; - - @override - Widget build(BuildContext context) { - return new GestureDetector( - key: const ValueKey('screenshotGestureDetector'), - behavior: HitTestBehavior.opaque, - onTap: () { - setState(() { - sampleIndex += 1; - }); - }, - child: new IgnorePointer( - child: samples[sampleIndex % samples.length], - ), - ); - } -} - -void main() { - enableFlutterDriverExtension(); - WidgetsApp.debugAllowBannerOverride = false; // No "debug" banner. - runApp(new SampleScreenshots()); -} diff --git a/examples/catalog/bin/screenshot_test.dart.template b/examples/catalog/bin/screenshot_test.dart.template deleted file mode 100644 index 50220b8760..0000000000 --- a/examples/catalog/bin/screenshot_test.dart.template +++ /dev/null @@ -1,36 +0,0 @@ -// This file was generated using bin/screenshot_test.dart.template and -// bin/sample_page.dart. For more information see README.md. - -import 'dart:async'; -import 'dart:io'; - -import 'package:flutter_driver/flutter_driver.dart'; -import 'package:test/test.dart'; - -void main() { - group('sample screenshots', () { - FlutterDriver driver; - - setUpAll(() async { - driver = await FlutterDriver.connect(); - }); - - tearDownAll(() async { - await driver?.close(); - }); - - test('take sample screenshots', () async { - final List paths = [ - @(paths) - ]; - for (String path in paths) { - await driver.waitUntilNoTransientCallbacks(); - final List pixels = await driver.screenshot(); - final File file = new File(path); - await file.writeAsBytes(pixels); - print('wrote $file'); - await driver.tap(find.byValueKey('screenshotGestureDetector')); - } - }); - }); -} diff --git a/examples/catalog/ios/Flutter/AppFrameworkInfo.plist b/examples/catalog/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index f2872cf474..0000000000 --- a/examples/catalog/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 9.0 - - diff --git a/examples/catalog/ios/Flutter/Debug.xcconfig b/examples/catalog/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 592ceee85b..0000000000 --- a/examples/catalog/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/examples/catalog/ios/Flutter/Release.xcconfig b/examples/catalog/ios/Flutter/Release.xcconfig deleted file mode 100644 index 592ceee85b..0000000000 --- a/examples/catalog/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/examples/catalog/ios/Runner.xcodeproj/project.pbxproj b/examples/catalog/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 35e0caba85..0000000000 --- a/examples/catalog/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,503 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74970F651EDBF3AE000507F3 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 74970F641EDBF3AE000507F3 /* GeneratedPluginRegistrant.m */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 74970F631EDBF3AE000507F3 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 74970F641EDBF3AE000507F3 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 74970F631EDBF3AE000507F3 /* GeneratedPluginRegistrant.h */, - 74970F641EDBF3AE000507F3 /* GeneratedPluginRegistrant.m */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = "The Flutter Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 74970F651EDBF3AE000507F3 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 24FC0D0321828CE100FD135A /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 24FC0D0421828CE100FD135A /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.animatedList; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.animatedList; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.animatedList; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 24FC0D0321828CE100FD135A /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 24FC0D0421828CE100FD135A /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14c7..0000000000 --- a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d981003d..0000000000 --- a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/examples/catalog/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/catalog/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 04a869b91e..0000000000 --- a/examples/catalog/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/catalog/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/catalog/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16ed..0000000000 --- a/examples/catalog/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/catalog/ios/Runner/AppDelegate.h b/examples/catalog/ios/Runner/AppDelegate.h deleted file mode 100644 index a78a945cd2..0000000000 --- a/examples/catalog/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2014 The Flutter 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 -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/examples/catalog/ios/Runner/AppDelegate.m b/examples/catalog/ios/Runner/AppDelegate.m deleted file mode 100644 index 202284911a..0000000000 --- a/examples/catalog/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2014 The Flutter 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 "AppDelegate.h" -#import "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - // Override point for customization after application launch. - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} -@end diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b2ab..0000000000 --- a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf0301..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd967d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bc..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde12118d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7ed..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc2306c2..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd967d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5c..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39d..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41e14..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f58536..0000000000 Binary files a/examples/catalog/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/examples/catalog/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/catalog/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index ebf48f6039..0000000000 --- a/examples/catalog/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/catalog/ios/Runner/Base.lproj/Main.storyboard b/examples/catalog/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516fb..0000000000 --- a/examples/catalog/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/catalog/ios/Runner/Info.plist b/examples/catalog/ios/Runner/Info.plist deleted file mode 100644 index 81e0505f06..0000000000 --- a/examples/catalog/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - animated_list - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/examples/catalog/ios/Runner/main.m b/examples/catalog/ios/Runner/main.m deleted file mode 100644 index 8607072273..0000000000 --- a/examples/catalog/ios/Runner/main.m +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 The Flutter 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 -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, - NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples/catalog/lib/animated_list.dart b/examples/catalog/lib/animated_list.dart deleted file mode 100644 index 4a2a29254d..0000000000 --- a/examples/catalog/lib/animated_list.dart +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2014 The Flutter 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/foundation.dart'; -import 'package:flutter/material.dart'; - -class AnimatedListSample extends StatefulWidget { - @override - _AnimatedListSampleState createState() => _AnimatedListSampleState(); -} - -class _AnimatedListSampleState extends State { - final GlobalKey _listKey = GlobalKey(); - ListModel _list; - int _selectedItem; - int _nextItem; // The next item inserted when the user presses the '+' button. - - @override - void initState() { - super.initState(); - _list = ListModel( - listKey: _listKey, - initialItems: [0, 1, 2], - removedItemBuilder: _buildRemovedItem, - ); - _nextItem = 3; - } - - // Used to build list items that haven't been removed. - Widget _buildItem(BuildContext context, int index, Animation animation) { - return CardItem( - animation: animation, - item: _list[index], - selected: _selectedItem == _list[index], - onTap: () { - setState(() { - _selectedItem = _selectedItem == _list[index] ? null : _list[index]; - }); - }, - ); - } - - // Used to build an item after it has been removed from the list. This method is - // needed because a removed item remains visible until its animation has - // completed (even though it's gone as far this ListModel is concerned). - // The widget will be used by the [AnimatedListState.removeItem] method's - // [AnimatedListRemovedItemBuilder] parameter. - Widget _buildRemovedItem(int item, BuildContext context, Animation animation) { - return CardItem( - animation: animation, - item: item, - selected: false, - // No gesture detector here: we don't want removed items to be interactive. - ); - } - - // Insert the "next item" into the list model. - void _insert() { - final int index = _selectedItem == null ? _list.length : _list.indexOf(_selectedItem); - _list.insert(index, _nextItem++); - } - - // Remove the selected item from the list model. - void _remove() { - if (_selectedItem != null) { - _list.removeAt(_list.indexOf(_selectedItem)); - setState(() { - _selectedItem = null; - }); - } - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('AnimatedList'), - actions: [ - IconButton( - icon: const Icon(Icons.add_circle), - onPressed: _insert, - tooltip: 'insert a new item', - ), - IconButton( - icon: const Icon(Icons.remove_circle), - onPressed: _remove, - tooltip: 'remove the selected item', - ), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: AnimatedList( - key: _listKey, - initialItemCount: _list.length, - itemBuilder: _buildItem, - ), - ), - ), - ); - } -} - -/// Keeps a Dart List in sync with an AnimatedList. -/// -/// The [insert] and [removeAt] methods apply to both the internal list and the -/// animated list that belongs to [listKey]. -/// -/// This class only exposes as much of the Dart List API as is needed by the -/// sample app. More list methods are easily added, however methods that mutate the -/// list must make the same changes to the animated list in terms of -/// [AnimatedListState.insertItem] and [AnimatedList.removeItem]. -class ListModel { - ListModel({ - @required this.listKey, - @required this.removedItemBuilder, - Iterable initialItems, - }) : assert(listKey != null), - assert(removedItemBuilder != null), - _items = initialItems?.toList() ?? []; - - final GlobalKey listKey; - final Widget Function(E item, BuildContext context, Animation animation) removedItemBuilder; - final List _items; - - AnimatedListState get _animatedList => listKey.currentState; - - void insert(int index, E item) { - _items.insert(index, item); - _animatedList.insertItem(index); - } - - E removeAt(int index) { - final E removedItem = _items.removeAt(index); - if (removedItem != null) { - _animatedList.removeItem(index, (BuildContext context, Animation animation) { - return removedItemBuilder(removedItem, context, animation); - }); - } - return removedItem; - } - - int get length => _items.length; - E operator [](int index) => _items[index]; - int indexOf(E item) => _items.indexOf(item); -} - -/// Displays its integer item as 'item N' on a Card whose color is based on -/// the item's value. The text is displayed in bright green if selected is true. -/// This widget's height is based on the animation parameter, it varies -/// from 0 to 128 as the animation varies from 0.0 to 1.0. -class CardItem extends StatelessWidget { - const CardItem({ - Key key, - @required this.animation, - this.onTap, - @required this.item, - this.selected = false, - }) : assert(animation != null), - assert(item != null && item >= 0), - assert(selected != null), - super(key: key); - - final Animation animation; - final VoidCallback onTap; - final int item; - final bool selected; - - @override - Widget build(BuildContext context) { - TextStyle textStyle = Theme.of(context).textTheme.headline4; - if (selected) - textStyle = textStyle.copyWith(color: Colors.lightGreenAccent[400]); - return Padding( - padding: const EdgeInsets.all(2.0), - child: SizeTransition( - axis: Axis.vertical, - sizeFactor: animation, - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: onTap, - child: SizedBox( - height: 128.0, - child: Card( - color: Colors.primaries[item % Colors.primaries.length], - child: Center( - child: Text('Item $item', style: textStyle), - ), - ), - ), - ), - ), - ); - } -} - -void main() { - runApp(AnimatedListSample()); -} - -/* -Sample Catalog - -Title: AnimatedList - -Summary: An AnimatedList for displaying a list of cards that stay -in sync with an app-specific ListModel. When an item is added to or removed -from the model, the corresponding card animates in or out of view. - -Description: -Tap an item to select it, tap it again to unselect. Tap '+' to insert at the -selected item, '-' to remove the selected item. The tap handlers add or -remove items from a `ListModel`, a simple encapsulation of `List` -that keeps the AnimatedList in sync. The list model has a GlobalKey for -its animated list. It uses the key to call the insertItem and removeItem -methods defined by AnimatedListState. - -Classes: AnimatedList, AnimatedListState - -Sample: AnimatedListSample - -See also: - - The "Components-Lists: Controls" section of the material design specification: - -*/ diff --git a/examples/catalog/lib/app_bar_bottom.dart b/examples/catalog/lib/app_bar_bottom.dart deleted file mode 100644 index 1435b50594..0000000000 --- a/examples/catalog/lib/app_bar_bottom.dart +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2014 The Flutter 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'; - -class AppBarBottomSample extends StatefulWidget { - @override - _AppBarBottomSampleState createState() => _AppBarBottomSampleState(); -} - -class _AppBarBottomSampleState extends State with SingleTickerProviderStateMixin { - TabController _tabController; - - @override - void initState() { - super.initState(); - _tabController = TabController(vsync: this, length: choices.length); - } - - @override - void dispose() { - _tabController.dispose(); - super.dispose(); - } - - void _nextPage(int delta) { - final int newIndex = _tabController.index + delta; - if (newIndex < 0 || newIndex >= _tabController.length) - return; - _tabController.animateTo(newIndex); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('AppBar Bottom Widget'), - leading: IconButton( - tooltip: 'Previous choice', - icon: const Icon(Icons.arrow_back), - onPressed: () { _nextPage(-1); }, - ), - actions: [ - IconButton( - icon: const Icon(Icons.arrow_forward), - tooltip: 'Next choice', - onPressed: () { _nextPage(1); }, - ), - ], - bottom: PreferredSize( - preferredSize: const Size.fromHeight(48.0), - child: Theme( - data: Theme.of(context).copyWith(accentColor: Colors.white), - child: Container( - height: 48.0, - alignment: Alignment.center, - child: TabPageSelector(controller: _tabController), - ), - ), - ), - ), - body: TabBarView( - controller: _tabController, - children: choices.map((Choice choice) { - return Padding( - padding: const EdgeInsets.all(16.0), - child: ChoiceCard(choice: choice), - ); - }).toList(), - ), - ), - ); - } -} - -class Choice { - const Choice({ this.title, this.icon }); - final String title; - final IconData icon; -} - -const List choices = [ - Choice(title: 'CAR', icon: Icons.directions_car), - Choice(title: 'BICYCLE', icon: Icons.directions_bike), - Choice(title: 'BOAT', icon: Icons.directions_boat), - Choice(title: 'BUS', icon: Icons.directions_bus), - Choice(title: 'TRAIN', icon: Icons.directions_railway), - Choice(title: 'WALK', icon: Icons.directions_walk), -]; - -class ChoiceCard extends StatelessWidget { - const ChoiceCard({ Key key, this.choice }) : super(key: key); - - final Choice choice; - - @override - Widget build(BuildContext context) { - final TextStyle textStyle = Theme.of(context).textTheme.headline4; - return Card( - color: Colors.white, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon(choice.icon, size: 128.0, color: textStyle.color), - Text(choice.title, style: textStyle), - ], - ), - ), - ); - } -} - -void main() { - runApp(AppBarBottomSample()); -} - -/* -Sample Catalog - -Title: AppBar with a custom bottom widget. - -Summary: An AppBar that includes a bottom widget. Any widget -with a PreferredSize can appear at the bottom of an AppBar. - -Summary: Any widget with a PreferredSize can appear at the bottom of an AppBar. - -Description: -Typically an AppBar's bottom widget is a TabBar however any widget with a -PreferredSize can be used. In this app, the app bar's bottom widget is a -TabPageSelector that displays the relative position of the selected page -in the app's TabBarView. The arrow buttons in the toolbar part of the app -bar and they select the previous or the next page. - -Classes: AppBar, PreferredSize, TabBarView, TabController - -Sample: AppBarBottomSample - -See also: - - The "Components-Tabs" section of the material design specification: - -*/ diff --git a/examples/catalog/lib/basic_app_bar.dart b/examples/catalog/lib/basic_app_bar.dart deleted file mode 100644 index 9c4f8ffeea..0000000000 --- a/examples/catalog/lib/basic_app_bar.dart +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2014 The Flutter 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'; - -// This app is a stateful, it tracks the user's current choice. -class BasicAppBarSample extends StatefulWidget { - @override - _BasicAppBarSampleState createState() => _BasicAppBarSampleState(); -} - -class _BasicAppBarSampleState extends State { - Choice _selectedChoice = choices[0]; // The app's "state". - - void _select(Choice choice) { - setState(() { // Causes the app to rebuild with the new _selectedChoice. - _selectedChoice = choice; - }); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Basic AppBar'), - actions: [ - IconButton( // action button - icon: Icon(choices[0].icon), - onPressed: () { _select(choices[0]); }, - ), - IconButton( // action button - icon: Icon(choices[1].icon), - onPressed: () { _select(choices[1]); }, - ), - PopupMenuButton( // overflow menu - onSelected: _select, - itemBuilder: (BuildContext context) { - return choices.skip(2).map>((Choice choice) { - return PopupMenuItem( - value: choice, - child: Text(choice.title), - ); - }).toList(); - }, - ), - ], - ), - body: Padding( - padding: const EdgeInsets.all(16.0), - child: ChoiceCard(choice: _selectedChoice), - ), - ), - ); - } -} - -class Choice { - const Choice({ this.title, this.icon }); - final String title; - final IconData icon; -} - -const List choices = [ - Choice(title: 'Car', icon: Icons.directions_car), - Choice(title: 'Bicycle', icon: Icons.directions_bike), - Choice(title: 'Boat', icon: Icons.directions_boat), - Choice(title: 'Bus', icon: Icons.directions_bus), - Choice(title: 'Train', icon: Icons.directions_railway), - Choice(title: 'Walk', icon: Icons.directions_walk), -]; - -class ChoiceCard extends StatelessWidget { - const ChoiceCard({ Key key, this.choice }) : super(key: key); - - final Choice choice; - - @override - Widget build(BuildContext context) { - final TextStyle textStyle = Theme.of(context).textTheme.headline4; - return Card( - color: Colors.white, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon(choice.icon, size: 128.0, color: textStyle.color), - Text(choice.title, style: textStyle), - ], - ), - ), - ); - } -} - -void main() { - runApp(BasicAppBarSample()); -} - -/* -Sample Catalog - -Title: AppBar Basics - -Summary: A basic AppBar with a title, actions, and an overflow dropdown menu. - -Description: -An app that displays one of a half dozen choices with an icon and a title. -The two most common choices are available as action buttons and the remaining -choices are included in the overflow dropdown menu. - -Classes: AppBar, IconButton, PopupMenuButton, Scaffold - -Sample: BasicAppBarSample - -See also: - - The "Layout-Structure" section of the material design specification: - -*/ diff --git a/examples/catalog/lib/custom_a11y_traversal.dart b/examples/catalog/lib/custom_a11y_traversal.dart deleted file mode 100644 index efb5f42370..0000000000 --- a/examples/catalog/lib/custom_a11y_traversal.dart +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright 2014 The Flutter 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/semantics.dart'; - -/// This example shows a set of widgets for changing data fields arranged in a -/// column of rows but, in accessibility mode, are traversed in a custom order. -/// -/// This demonstrates how Flutter's accessibility system describes custom -/// traversal orders using sort keys. -/// -/// The example app here has three fields that have a title and up/down spinner -/// buttons above and below. The traversal order should allow the user to focus -/// on each title, the input field next, the up spinner next, and the down -/// spinner last before moving to the next input title. -/// -/// Users that do not use a screen reader (e.g. TalkBack on Android and -/// VoiceOver on iOS) will just see a regular app with controls. -/// -/// The example's [RowColumnTraversal] widget sets up two [Semantics] objects -/// that wrap the given [Widget] child, providing the traversal order they -/// should have in the "row" direction, and then the traversal order they should -/// have in the "column" direction. -/// -/// Since widgets are globally sorted by their sort key, the order does not have -/// to conform to the widget hierarchy. Indeed, in this example, we traverse -/// vertically first, but the widget hierarchy is a column of rows. -/// -/// See also: -/// -/// * [Semantics] for an object that annotates widgets with accessibility semantics -/// (including traversal order). -/// * [SemanticSortKey] for the base class of all semantic sort keys. -/// * [OrdinalSortKey] for a concrete sort key that sorts based on the given ordinal. -class RowColumnTraversal extends StatelessWidget { - const RowColumnTraversal({this.rowOrder, this.columnOrder, this.child}); - - final int rowOrder; - final int columnOrder; - final Widget child; - - /// Builds a widget hierarchy that wraps [child]. - /// - /// This function expresses the sort keys as a hierarchy. - @override - Widget build(BuildContext context) { - return Semantics( - sortKey: OrdinalSortKey(columnOrder.toDouble()), - child: Semantics( - sortKey: OrdinalSortKey(rowOrder.toDouble()), - child: child, - ), - ); - } -} - -// --------------- Component widgets --------------------- - -/// A Button class that wraps an [IconButton] with a [RowColumnTraversal] to -/// set its traversal order. -class SpinnerButton extends StatelessWidget { - const SpinnerButton({ - Key key, - this.onPressed, - this.icon, - this.rowOrder, - this.columnOrder, - this.field, - this.increment, - }) : super(key: key); - - final VoidCallback onPressed; - final IconData icon; - final int rowOrder; - final int columnOrder; - final Field field; - final bool increment; - - @override - Widget build(BuildContext context) { - final String label = '${increment ? 'Increment' : 'Decrement'} ${_fieldToName(field)}'; - - return RowColumnTraversal( - rowOrder: rowOrder, - columnOrder: columnOrder, - child: Center( - child: IconButton( - icon: Icon(icon), - onPressed: onPressed, - tooltip: label, - ), - ), - ); - } -} - -/// A text entry field that wraps a [TextField] with a [RowColumnTraversal] to -/// set its traversal order. -class FieldWidget extends StatelessWidget { - const FieldWidget({ - Key key, - this.rowOrder, - this.columnOrder, - this.onIncrease, - this.onDecrease, - this.value, - this.field, - }) : super(key: key); - - final int rowOrder; - final int columnOrder; - final VoidCallback onDecrease; - final VoidCallback onIncrease; - final int value; - final Field field; - - @override - Widget build(BuildContext context) { - final String stringValue = '${_fieldToName(field)} $value'; - final String increasedValue = '${_fieldToName(field)} ${value + 1}'; - final String decreasedValue = '${_fieldToName(field)} ${value - 1}'; - - return RowColumnTraversal( - rowOrder: rowOrder, - columnOrder: columnOrder, - child: Center( - child: Semantics( - onDecrease: onDecrease, - onIncrease: onIncrease, - value: stringValue, - increasedValue: increasedValue, - decreasedValue: decreasedValue, - child: ExcludeSemantics(child: Text(value.toString())), - ), - ), - ); - } -} - -// --------------- Field manipulation functions --------------------- - -/// An enum that describes which column we're referring to. -enum Field { DOGS, CATS, FISH } - -String _fieldToName(Field field) { - switch (field) { - case Field.DOGS: - return 'Dogs'; - case Field.CATS: - return 'Cats'; - case Field.FISH: - return 'Fish'; - } - return null; -} - -// --------------- Main app --------------------- - -/// The top-level example widget that serves as the body of the app. -class CustomTraversalExample extends StatefulWidget { - @override - CustomTraversalExampleState createState() => CustomTraversalExampleState(); -} - -/// The state object for the top level example widget. -class CustomTraversalExampleState extends State { - /// The fields that we are manipulating. List indices correspond to - /// the entries in the [Field] enum. - List fields = [0, 0, 0]; - - void _addToField(Field field, int delta) { - setState(() { - fields[field.index] += delta; - }); - } - - Widget _makeFieldHeader(int rowOrder, int columnOrder, Field field) { - return RowColumnTraversal( - rowOrder: rowOrder, - columnOrder: columnOrder, - child: Text(_fieldToName(field)), - ); - } - - Widget _makeSpinnerButton(int rowOrder, int columnOrder, Field field, {bool increment = true}) { - return SpinnerButton( - rowOrder: rowOrder, - columnOrder: columnOrder, - icon: increment ? Icons.arrow_upward : Icons.arrow_downward, - onPressed: () => _addToField(field, increment ? 1 : -1), - field: field, - increment: increment, - ); - } - - Widget _makeEntryField(int rowOrder, int columnOrder, Field field) { - return FieldWidget( - rowOrder: rowOrder, - columnOrder: columnOrder, - onIncrease: () => _addToField(field, 1), - onDecrease: () => _addToField(field, -1), - value: fields[field.index], - field: field, - ); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Pet Inventory'), - ), - body: Builder( - builder: (BuildContext context) { - return DefaultTextStyle( - style: DefaultTextStyle.of(context).style.copyWith(fontSize: 21.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Semantics( - // Since this is the only sort key that the text has, it - // will be compared with the 'column' OrdinalSortKeys of all the - // fields, because the column sort keys are first in the other fields. - // - // An ordinal of "0.0" means that it will be traversed before column 1. - sortKey: const OrdinalSortKey(0.0), - child: const Text( - 'How many pets do you own?', - ), - ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10.0)), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _makeFieldHeader(1, 0, Field.DOGS), - _makeFieldHeader(1, 1, Field.CATS), - _makeFieldHeader(1, 2, Field.FISH), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _makeSpinnerButton(3, 0, Field.DOGS, increment: true), - _makeSpinnerButton(3, 1, Field.CATS, increment: true), - _makeSpinnerButton(3, 2, Field.FISH, increment: true), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _makeEntryField(2, 0, Field.DOGS), - _makeEntryField(2, 1, Field.CATS), - _makeEntryField(2, 2, Field.FISH), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - children: [ - _makeSpinnerButton(4, 0, Field.DOGS, increment: false), - _makeSpinnerButton(4, 1, Field.CATS, increment: false), - _makeSpinnerButton(4, 2, Field.FISH, increment: false), - ], - ), - const Padding(padding: EdgeInsets.symmetric(vertical: 10.0)), - Semantics( - // Since this is the only sort key that the reset button has, it - // will be compared with the 'column' OrdinalSortKeys of all the - // fields, because the column sort keys are first in the other fields. - // - // an ordinal of "5.0" means that it will be traversed after column 4. - sortKey: const OrdinalSortKey(5.0), - child: MaterialButton( - child: const Text('RESET'), - textTheme: ButtonTextTheme.normal, - textColor: Colors.blue, - onPressed: () { - setState(() { - fields = [0, 0, 0]; - }); - }, - ), - ), - ], - ), - ); - }, - ), - ), - ); - } -} - -void main() { - runApp(CustomTraversalExample()); -} - -/* -Sample Catalog - -Title: CustomTraversalExample - -Summary: An app that demonstrates a custom semantics traversal order. - -Description: -This app presents a value selection interface where the fields can be -incremented or decremented using spinner arrows. In accessibility mode, the -widgets are traversed in a custom order from one column to the next, starting -with the column title, moving to the input field, then to the "up" increment -button, and lastly to the "down" decrement button. - -When not in accessibility mode, the app works as one would expect. - -Classes: Semantics - -Sample: CustomTraversalExample -*/ diff --git a/examples/catalog/lib/custom_semantics.dart b/examples/catalog/lib/custom_semantics.dart deleted file mode 100644 index efe9e8afb9..0000000000 --- a/examples/catalog/lib/custom_semantics.dart +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2014 The Flutter 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'; - -/// A [ListTile] containing a dropdown menu that exposes itself as an -/// "Adjustable" to screen readers (e.g. TalkBack on Android and VoiceOver on -/// iOS). -/// -/// This allows screen reader users to swipe up/down (on iOS) or use the volume -/// keys (on Android) to switch between the values in the dropdown menu. -/// Depending on what the values in the dropdown menu are this can be a more -/// intuitive way of switching values compared to exposing the content of the -/// drop down menu as a screen overlay from which the user can select. -/// -/// Users that do not use a screen reader will just see a regular dropdown menu. -class AdjustableDropdownListTile extends StatelessWidget { - const AdjustableDropdownListTile({ - this.label, - this.value, - this.items, - this.onChanged, - }); - - final String label; - final String value; - final List items; - final ValueChanged onChanged; - - @override - Widget build(BuildContext context) { - final int indexOfValue = items.indexOf(value); - assert(indexOfValue != -1); - - final bool canIncrease = indexOfValue < items.length - 1; - final bool canDecrease = indexOfValue > 0; - - return Semantics( - container: true, - label: label, - value: value, - increasedValue: canIncrease ? _increasedValue : null, - decreasedValue: canDecrease ? _decreasedValue : null, - onIncrease: canIncrease ? _performIncrease : null, - onDecrease: canDecrease ? _performDecrease : null, - child: ExcludeSemantics( - child: ListTile( - title: Text(label), - trailing: DropdownButton( - value: value, - onChanged: onChanged, - items: items.map>((String item) { - return DropdownMenuItem( - value: item, - child: Text(item), - ); - }).toList(), - ), - ), - ), - ); - } - - String get _increasedValue { - final int indexOfValue = items.indexOf(value); - assert(indexOfValue < items.length - 1); - return items[indexOfValue + 1]; - } - - String get _decreasedValue { - final int indexOfValue = items.indexOf(value); - assert(indexOfValue > 0); - return items[indexOfValue - 1]; - } - - void _performIncrease() => onChanged(_increasedValue); - - void _performDecrease() => onChanged(_decreasedValue); -} - -class AdjustableDropdownExample extends StatefulWidget { - @override - AdjustableDropdownExampleState createState() => AdjustableDropdownExampleState(); -} - -class AdjustableDropdownExampleState extends State { - - final List items = [ - '1 second', - '5 seconds', - '15 seconds', - '30 seconds', - '1 minute', - ]; - String timeout; - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Adjustable DropDown'), - ), - body: ListView( - children: [ - AdjustableDropdownListTile( - label: 'Timeout', - value: timeout ?? items[2], - items: items, - onChanged: (String value) { - setState(() { - timeout = value; - }); - }, - ), - ], - ), - ), - ); - } -} - -void main() { - runApp(AdjustableDropdownExample()); -} - -/* -Sample Catalog - -Title: AdjustableDropdownListTile - -Summary: A dropdown menu that exposes itself as an "Adjustable" to screen -readers. - -Description: -This app presents a dropdown menu to the user that exposes itself as an -"Adjustable" to screen readers (e.g. TalkBack on Android and VoiceOver on iOS). -This allows users of screen readers to cycle through the values of the dropdown -menu by swiping up or down on the screen with one finger (on iOS) or by using -the volume keys (on Android). Depending on the values in the dropdown this -behavior may be more intuitive to screen reader users compared to showing the -classical dropdown overlay on screen to choose a value. - -When the screen reader is turned off, the dropdown menu behaves like any -dropdown menu would. - -Classes: Semantics - -Sample: AdjustableDropdownListTile - -*/ diff --git a/examples/catalog/lib/expansion_tile_sample.dart b/examples/catalog/lib/expansion_tile_sample.dart deleted file mode 100644 index 96c024be59..0000000000 --- a/examples/catalog/lib/expansion_tile_sample.dart +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright 2014 The Flutter 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'; - -class ExpansionTileSample extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('ExpansionTile'), - ), - body: ListView.builder( - itemBuilder: (BuildContext context, int index) => EntryItem(data[index]), - itemCount: data.length, - ), - ), - ); - } -} - -// One entry in the multilevel list displayed by this app. -class Entry { - Entry(this.title, [this.children = const []]); - final String title; - final List children; -} - -// The entire multilevel list displayed by this app. -final List data = [ - Entry('Chapter A', - [ - Entry('Section A0', - [ - Entry('Item A0.1'), - Entry('Item A0.2'), - Entry('Item A0.3'), - ], - ), - Entry('Section A1'), - Entry('Section A2'), - ], - ), - Entry('Chapter B', - [ - Entry('Section B0'), - Entry('Section B1'), - ], - ), - Entry('Chapter C', - [ - Entry('Section C0'), - Entry('Section C1'), - Entry('Section C2', - [ - Entry('Item C2.0'), - Entry('Item C2.1'), - Entry('Item C2.2'), - Entry('Item C2.3'), - ], - ), - ], - ), -]; - -// Displays one Entry. If the entry has children then it's displayed -// with an ExpansionTile. -class EntryItem extends StatelessWidget { - const EntryItem(this.entry); - - final Entry entry; - - Widget _buildTiles(Entry root) { - if (root.children.isEmpty) - return ListTile(title: Text(root.title)); - return ExpansionTile( - key: PageStorageKey(root), - title: Text(root.title), - children: root.children.map(_buildTiles).toList(), - ); - } - - @override - Widget build(BuildContext context) { - return _buildTiles(entry); - } -} - -void main() { - runApp(ExpansionTileSample()); -} - -/* -Sample Catalog - -Title: ExpansionTile - -Summary: An ExpansionTile for building nested lists, with two or more levels. - -Description: -This app displays hierarchical data with ExpansionTiles. Tapping a tile -expands or collapses the view of its children. When a tile is collapsed -its children are disposed so that the widget footprint of the list only -reflects what's visible. - -When displayed within a scrollable that creates its list items lazily, -like a scrollable list created with `ListView.builder()`, ExpansionTiles -can be quite efficient, particularly for material design "expand/collapse" -lists. - - -Classes: ExpansionTile, ListView - -Sample: ExpansionTileSample - -See also: - - The "expand/collapse" part of the material design specification: - -*/ diff --git a/examples/catalog/lib/main.dart b/examples/catalog/lib/main.dart deleted file mode 100644 index c3fb7d315c..0000000000 --- a/examples/catalog/lib/main.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 The Flutter 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/widgets.dart'; - -void main() { - runApp( - const Center( - child: Text( - 'Instead run:\nflutter run lib/xxx.dart', - textDirection: TextDirection.ltr, - ), - ), - ); -} diff --git a/examples/catalog/lib/tabbed_app_bar.dart b/examples/catalog/lib/tabbed_app_bar.dart deleted file mode 100644 index f5890a1d9c..0000000000 --- a/examples/catalog/lib/tabbed_app_bar.dart +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2014 The Flutter 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'; - -class TabbedAppBarSample extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - home: DefaultTabController( - length: choices.length, - child: Scaffold( - appBar: AppBar( - title: const Text('Tabbed AppBar'), - bottom: TabBar( - isScrollable: true, - tabs: choices.map((Choice choice) { - return Tab( - text: choice.title, - icon: Icon(choice.icon), - ); - }).toList(), - ), - ), - body: TabBarView( - children: choices.map((Choice choice) { - return Padding( - padding: const EdgeInsets.all(16.0), - child: ChoiceCard(choice: choice), - ); - }).toList(), - ), - ), - ), - ); - } -} - -class Choice { - const Choice({ this.title, this.icon }); - final String title; - final IconData icon; -} - -const List choices = [ - Choice(title: 'CAR', icon: Icons.directions_car), - Choice(title: 'BICYCLE', icon: Icons.directions_bike), - Choice(title: 'BOAT', icon: Icons.directions_boat), - Choice(title: 'BUS', icon: Icons.directions_bus), - Choice(title: 'TRAIN', icon: Icons.directions_railway), - Choice(title: 'WALK', icon: Icons.directions_walk), -]; - -class ChoiceCard extends StatelessWidget { - const ChoiceCard({ Key key, this.choice }) : super(key: key); - - final Choice choice; - - @override - Widget build(BuildContext context) { - final TextStyle textStyle = Theme.of(context).textTheme.headline4; - return Card( - color: Colors.white, - child: Center( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon(choice.icon, size: 128.0, color: textStyle.color), - Text(choice.title, style: textStyle), - ], - ), - ), - ); - } -} - -void main() { - runApp(TabbedAppBarSample()); -} - -/* -Sample Catalog - -Title: Tabbed AppBar - -Summary: An AppBar with a TabBar for navigating pages just below it. - -Description: -A TabBar can be used to navigate among the pages displayed in a TabBarView. -Although a TabBar is an ordinary widget that can appear anywhere, it's most often -included in the application's AppBar. - -Classes: AppBar, DefaultTabController, TabBar, Scaffold, TabBarView - -Sample: TabbedAppBarSample - -See also: - - The "Components-Tabs" section of the material design specification: - -*/ diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml deleted file mode 100644 index dece40d106..0000000000 --- a/examples/catalog/pubspec.yaml +++ /dev/null @@ -1,84 +0,0 @@ -name: sample_catalog -description: A collection of Flutter sample apps - -environment: - # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite. - sdk: ">=2.0.0-dev.68.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - path: 1.8.0-nullsafety.1 - - characters: 1.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - collection: 1.15.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - meta: 1.3.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - typed_data: 1.3.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - vector_math: 2.1.0-nullsafety.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: 1.16.0-nullsafety.5 - - _fe_analyzer_shared: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - analyzer: 0.39.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - archive: 2.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - args: 1.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - async: 2.5.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - boolean_selector: 2.1.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - charcode: 1.2.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - cli_util: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - clock: 1.1.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - coverage: 0.14.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - crypto: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - csslib: 0.16.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - fake_async: 1.2.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - file: 6.0.0-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - glob: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - html: 0.14.0+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - http: 0.12.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - http_multi_server: 2.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - http_parser: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - io: 0.3.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - js: 0.6.3-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - json_rpc_2: 2.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - logging: 0.11.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - matcher: 0.12.10-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - mime: 0.9.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_interop: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_io: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - package_config: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - pedantic: 1.10.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - pool: 1.5.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - pub_semver: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf_packages_handler: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - source_map_stack_trace: 2.1.0-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - source_maps: 0.10.10-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - source_span: 1.8.0-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - stack_trace: 1.10.0-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - stream_channel: 2.1.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - string_scanner: 1.1.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - sync_http: 0.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - term_glyph: 1.2.0-nullsafety.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - test_api: 0.2.19-nullsafety.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - test_core: 0.3.12-nullsafety.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - vm_service: 4.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - watcher: 0.9.7+15 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - web_socket_channel: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - webdriver: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - webkit_inspection_protocol: 0.7.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - yaml: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - -flutter: - uses-material-design: true - -# PUBSPEC CHECKSUM: 5ffe diff --git a/examples/catalog/test/animated_list_test.dart b/examples/catalog/test/animated_list_test.dart deleted file mode 100644 index c4eb8964bb..0000000000 --- a/examples/catalog/test/animated_list_test.dart +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2014 The Flutter 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_test/flutter_test.dart'; -import 'package:sample_catalog/animated_list.dart' as animated_list_sample; - -void main() { - testWidgets('animated_list sample app smoke test', (WidgetTester tester) async { - animated_list_sample.main(); - await tester.pump(); - - expect(find.text('Item 0'), findsOneWidget); - expect(find.text('Item 1'), findsOneWidget); - expect(find.text('Item 2'), findsOneWidget); - - final Finder insertButton = find.byTooltip('insert a new item'); - final Finder removeButton = find.byTooltip('remove the selected item'); - expect(insertButton, findsOneWidget); - expect(removeButton, findsOneWidget); - - // Remove items 0, 1, 2. - await tester.tap(find.text('Item 0')); - await tester.tap(removeButton); - await tester.pumpAndSettle(); - await tester.tap(find.text('Item 1')); - await tester.tap(removeButton); - await tester.pumpAndSettle(); - await tester.tap(find.text('Item 2')); - await tester.tap(removeButton); - await tester.pumpAndSettle(); - - // Append items 3, 4, 5, 6. - await tester.tap(insertButton); - await tester.tap(insertButton); - await tester.tap(insertButton); - await tester.tap(insertButton); - await tester.pumpAndSettle(); - - expect(find.text('Item 0'), findsNothing); - expect(find.text('Item 1'), findsNothing); - expect(find.text('Item 2'), findsNothing); - expect(find.text('Item 3'), findsOneWidget); - expect(find.text('Item 4'), findsOneWidget); - expect(find.text('Item 5'), findsOneWidget); - expect(find.text('Item 6'), findsOneWidget); - - // Insert items 7, 8 at item 3's position (at the top) - await tester.tap(find.text('Item 3')); - await tester.tap(insertButton); - await tester.tap(insertButton); - await tester.pumpAndSettle(); - - expect(find.text('Item 7'), findsOneWidget); - expect(find.text('Item 8'), findsOneWidget); - - // Scroll to the end. - await tester.fling(find.text('Item 7'), const Offset(0.0, -200.0), 1000.0); - await tester.pumpAndSettle(); - expect(find.text('Item 6'), findsOneWidget); - expect(find.text('Item 8'), findsNothing); - }); -} diff --git a/examples/catalog/test/app_bar_bottom_test.dart b/examples/catalog/test/app_bar_bottom_test.dart deleted file mode 100644 index 2e4c763121..0000000000 --- a/examples/catalog/test/app_bar_bottom_test.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Flutter 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_test/flutter_test.dart'; -import 'package:sample_catalog/app_bar_bottom.dart' as app_bar_bottom_sample; - -final int choiceCount = app_bar_bottom_sample.choices.length; -IconData iconAt(int index) => app_bar_bottom_sample.choices[index].icon; - -Finder findChoiceCard(IconData icon) { - return find.descendant(of: find.byType(Card), matching: find.byIcon(icon)); -} - -void main() { - testWidgets('app_bar_bottom sample smoke test', (WidgetTester tester) async { - app_bar_bottom_sample.main(); - await tester.pump(); - - // Cycle through the choices using the forward and backwards arrows. - - final Finder nextChoice = find.byTooltip('Next choice'); - for (int i = 0; i < choiceCount; i += 1) { - expect(findChoiceCard(iconAt(i)), findsOneWidget); - await tester.tap(nextChoice); - await tester.pumpAndSettle(); - } - - final Finder previousChoice = find.byTooltip('Previous choice'); - for (int i = choiceCount - 1; i >= 0; i -= 1) { - expect(findChoiceCard(iconAt(i)), findsOneWidget); - await tester.tap(previousChoice); - await tester.pumpAndSettle(); - } - }); -} diff --git a/examples/catalog/test/basic_app_bar_test.dart b/examples/catalog/test/basic_app_bar_test.dart deleted file mode 100644 index 321f73cb3e..0000000000 --- a/examples/catalog/test/basic_app_bar_test.dart +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 The Flutter 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_test/flutter_test.dart'; -import 'package:sample_catalog/basic_app_bar.dart' as basic_app_bar_sample; - -int choiceCount = basic_app_bar_sample.choices.length; -IconData iconAt(int index) => basic_app_bar_sample.choices[index].icon; -String titleAt(int index) => basic_app_bar_sample.choices[index].title; - -Finder findAppBarIcon(IconData icon) { - return find.descendant(of: find.byType(AppBar), matching: find.byIcon(icon)); -} - -Finder findChoiceCard(IconData icon) { - return find.descendant(of: find.byType(Card), matching: find.byIcon(icon)); -} - -void main() { - testWidgets('basic_app_bar sample smoke test', (WidgetTester tester) async { - basic_app_bar_sample.main(); - await tester.pump(); - - // Tap on the two action buttons and all of the overflow menu items. - // Verify that a Card with the expected icon appears. - - await tester.tap(findAppBarIcon(iconAt(0))); - await tester.pumpAndSettle(); - expect(findChoiceCard(iconAt(0)), findsOneWidget); - - await tester.tap(findAppBarIcon(iconAt(1))); - await tester.pumpAndSettle(); - expect(findChoiceCard(iconAt(1)), findsOneWidget); - - for (int i = 2; i < choiceCount; i += 1) { - await tester.tap(findAppBarIcon(Icons.more_vert)); - await tester.pumpAndSettle(); - await tester.tap(find.text(titleAt(i))); - await tester.pumpAndSettle(); - expect(findChoiceCard(iconAt(i)), findsOneWidget); - } - }); -} diff --git a/examples/catalog/test/custom_semantics_test.dart b/examples/catalog/test/custom_semantics_test.dart deleted file mode 100644 index dd8217679d..0000000000 --- a/examples/catalog/test/custom_semantics_test.dart +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2014 The Flutter 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/rendering.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:sample_catalog/custom_semantics.dart' as custom_semantics show main; -import 'package:sample_catalog/custom_semantics.dart'; - -void main() { - testWidgets('custom_semantics sample smoke test', (WidgetTester tester) async { - // Turn on Semantics - final SemanticsHandle semanticsHandler = tester.binding.pipelineOwner.ensureSemantics(); - final SemanticsOwner semanticsOwner = tester.binding.pipelineOwner.semanticsOwner; - - // Build the sample app - custom_semantics.main(); - await tester.pump(); - - // Verify it correctly exposes its semantics. - final SemanticsNode semantics = tester.getSemantics(find.byType(AdjustableDropdownListTile)); - - expectAdjustable(semantics, - hasIncreaseAction: true, - hasDecreaseAction: true, - label: 'Timeout', - decreasedValue: '5 seconds', - value: '15 seconds', - increasedValue: '30 seconds', - ); - - // Increase - semanticsOwner.performAction(semantics.id, SemanticsAction.increase); - await tester.pump(); - - expectAdjustable(semantics, - hasIncreaseAction: true, - hasDecreaseAction: true, - label: 'Timeout', - decreasedValue: '15 seconds', - value: '30 seconds', - increasedValue: '1 minute', - ); - - // Increase all the way to highest value - semanticsOwner.performAction(semantics.id, SemanticsAction.increase); - await tester.pump(); - - expectAdjustable(semantics, - hasIncreaseAction: false, - hasDecreaseAction: true, - label: 'Timeout', - decreasedValue: '30 seconds', - value: '1 minute', - ); - - // Decrease - semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); - await tester.pump(); - - expectAdjustable(semantics, - hasIncreaseAction: true, - hasDecreaseAction: true, - label: 'Timeout', - decreasedValue: '15 seconds', - value: '30 seconds', - increasedValue: '1 minute', - ); - - // Decrease all the way to lowest value - semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); - await tester.pump(); - semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); - await tester.pump(); - semanticsOwner.performAction(semantics.id, SemanticsAction.decrease); - await tester.pump(); - - expectAdjustable(semantics, - hasIncreaseAction: true, - hasDecreaseAction: false, - label: 'Timeout', - value: '1 second', - increasedValue: '5 seconds', - ); - - // Clean-up - semanticsHandler.dispose(); - }); -} - -void expectAdjustable( - SemanticsNode node, { - bool hasIncreaseAction = true, - bool hasDecreaseAction = true, - String label = '', - String decreasedValue = '', - String value = '', - String increasedValue = '', -}) { - final SemanticsData semanticsData = node.getSemanticsData(); - - int actions = 0; - if (hasIncreaseAction) - actions |= SemanticsAction.increase.index; - if (hasDecreaseAction) - actions |= SemanticsAction.decrease.index; - - expect(semanticsData.actions, actions); - expect(semanticsData.label, label); - expect(semanticsData.decreasedValue, decreasedValue); - expect(semanticsData.value, value); - expect(semanticsData.increasedValue, increasedValue); -} diff --git a/examples/catalog/test/expansion_tile_sample_test.dart b/examples/catalog/test/expansion_tile_sample_test.dart deleted file mode 100644 index 9188652da2..0000000000 --- a/examples/catalog/test/expansion_tile_sample_test.dart +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2014 The Flutter 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_test/flutter_test.dart'; -import 'package:sample_catalog/expansion_tile_sample.dart' as expansion_tile_sample; -import 'package:sample_catalog/expansion_tile_sample.dart' show Entry; - -void main() { - testWidgets('expansion_tile sample smoke test', (WidgetTester tester) async { - expansion_tile_sample.main(); - await tester.pump(); - - // Initially only the top level EntryItems (the "chapters") are present. - for (final Entry chapter in expansion_tile_sample.data) { - expect(find.text(chapter.title), findsOneWidget); - for (final Entry section in chapter.children) { - expect(find.text(section.title), findsNothing); - for (final Entry item in section.children) - expect(find.text(item.title), findsNothing); - } - } - - Future scrollUpOneEntry() async { - await tester.dragFrom(const Offset(200.0, 200.0), const Offset(0.0, -88.00)); - await tester.pumpAndSettle(); - } - - Future tapEntry(String title) async { - await tester.tap(find.text(title)); - await tester.pumpAndSettle(); - } - - // Expand the chapters. Now the chapter and sections, but not the - // items, should be present. - for (final Entry chapter in expansion_tile_sample.data.reversed) - await tapEntry(chapter.title); - - for (final Entry chapter in expansion_tile_sample.data) { - expect(find.text(chapter.title), findsOneWidget); - for (final Entry section in chapter.children) { - expect(find.text(section.title), findsOneWidget); - await scrollUpOneEntry(); - for (final Entry item in section.children) - expect(find.text(item.title), findsNothing); - } - await scrollUpOneEntry(); - } - - // - scroll to the top - - await tester.flingFrom(const Offset(200.0, 200.0), const Offset(0.0, 100.0), 5000.0); - await tester.pumpAndSettle(); - - // Expand the sections. Now Widgets for all three levels should be present. - for (final Entry chapter in expansion_tile_sample.data) { - for (final Entry section in chapter.children) { - await tapEntry(section.title); - await scrollUpOneEntry(); - } - await scrollUpOneEntry(); - } - - // We're scrolled to the bottom so the very last item is visible. - // Working in reverse order, so we don't need to do anymore scrolling, - // check that everything is visible and close the sections and - // chapters as we go up. - for (final Entry chapter in expansion_tile_sample.data.reversed) { - expect(find.text(chapter.title), findsOneWidget); - for (final Entry section in chapter.children.reversed) { - expect(find.text(section.title), findsOneWidget); - for (final Entry item in section.children.reversed) - expect(find.text(item.title), findsOneWidget); - await tapEntry(section.title); // close the section - } - await tapEntry(chapter.title); // close the chapter - } - - // Finally only the top level EntryItems (the "chapters") are present. - for (final Entry chapter in expansion_tile_sample.data) { - expect(find.text(chapter.title), findsOneWidget); - for (final Entry section in chapter.children) { - expect(find.text(section.title), findsNothing); - for (final Entry item in section.children) - expect(find.text(item.title), findsNothing); - } - } - - }); -} diff --git a/examples/catalog/test/tabbed_app_bar_test.dart b/examples/catalog/test/tabbed_app_bar_test.dart deleted file mode 100644 index 59d33cc255..0000000000 --- a/examples/catalog/test/tabbed_app_bar_test.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2014 The Flutter 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_test/flutter_test.dart'; -import 'package:sample_catalog/tabbed_app_bar.dart' as tabbed_app_bar_sample; - -final int choiceCount = tabbed_app_bar_sample.choices.length; -IconData iconAt(int index) => tabbed_app_bar_sample.choices[index].icon; - -Finder findChoiceCard(IconData icon) { - return find.descendant(of: find.byType(Card), matching: find.byIcon(icon)); -} - -Finder findTab(IconData icon) { - return find.descendant(of: find.byType(Tab), matching: find.byIcon(icon)); -} - -void main() { - testWidgets('tabbed_app_bar sample smoke test', (WidgetTester tester) async { - tabbed_app_bar_sample.main(); - await tester.pump(); - - // Tap on each tab, verify that a Card with the expected icon appears. - for (int i = 0; i < choiceCount; i += 1) { - await tester.tap(findTab(iconAt(i))); - await tester.pumpAndSettle(); - expect(findChoiceCard(iconAt(i)), findsOneWidget); - // Scroll the tabBar by about one tab width - await tester.drag(find.byType(TabBar), const Offset(-24.0, 0.0)); - await tester.pumpAndSettle(); - } - }); -} diff --git a/examples/catalog/test_driver/README.md b/examples/catalog/test_driver/README.md deleted file mode 100644 index 8622c89978..0000000000 --- a/examples/catalog/test_driver/README.md +++ /dev/null @@ -1 +0,0 @@ -The screenshot.dart and screenshot_test.dart files were generated by ../bin/sample_page.dart. They should not be checked in. diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart index 98749c973e..513ee54fca 100644 --- a/packages/flutter/lib/src/material/app_bar.dart +++ b/packages/flutter/lib/src/material/app_bar.dart @@ -171,11 +171,6 @@ class _ToolbarContainerLayout extends SingleChildLayoutDelegate { /// can expand and collapse. /// * /// * Cookbook: [Place a floating app bar above a list](https://flutter.dev/docs/cookbook/lists/floating-app-bar) -/// * See our -/// [AppBar Basics sample](https://flutter.dev/docs/catalog/samples/basic-app-bar) -/// and our advanced samples with app bars with -/// [tabs](https://flutter.dev/docs/catalog/samples/tabbed-app-bar) or -/// [custom bottom widgets](https://flutter.dev/docs/catalog/samples/app-bar-bottom). class AppBar extends StatefulWidget implements PreferredSizeWidget { /// Creates a material design app bar. /// diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart index 79f181c633..767bb125d8 100644 --- a/packages/flutter/lib/src/material/scaffold.dart +++ b/packages/flutter/lib/src/material/scaffold.dart @@ -1412,8 +1412,6 @@ class _FloatingActionButtonTransitionState extends State<_FloatingActionButtonTr /// * [ScaffoldState], which is the state associated with this widget. /// * /// * Cookbook: [Add a Drawer to a screen](https://flutter.dev/docs/cookbook/design/drawer) -/// * See our -/// [Scaffold Sample Apps](https://flutter.dev/docs/catalog/samples/Scaffold). class Scaffold extends StatefulWidget { /// Creates a visual scaffold for material design widgets. const Scaffold({