Commit 2a29701f88e69d9608c16d61725b97dab03ccff1

Authored by liangchengyou
0 parents

feat:提交代码

Showing 83 changed files with 2301 additions and 0 deletions
.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +# Miscellaneous
  2 +*.class
  3 +*.log
  4 +*.pyc
  5 +*.swp
  6 +.DS_Store
  7 +.atom/
  8 +.buildlog/
  9 +.history
  10 +.svn/
  11 +
  12 +# IntelliJ related
  13 +*.iml
  14 +*.ipr
  15 +*.iws
  16 +.idea/
  17 +
  18 +# The .vscode folder contains launch configuration and tasks you configure in
  19 +# VS Code which you may wish to be included in version control, so this line
  20 +# is commented out by default.
  21 +#.vscode/
  22 +
  23 +# Flutter/Dart/Pub related
  24 +**/doc/api/
  25 +**/ios/Flutter/.last_build_id
  26 +.dart_tool/
  27 +.flutter-plugins
  28 +.flutter-plugins-dependencies
  29 +.packages
  30 +.pub-cache/
  31 +.pub/
  32 +/build/
  33 +
  34 +# Web related
  35 +lib/generated_plugin_registrant.dart
  36 +
  37 +# Symbolication related
  38 +app.*.symbols
  39 +
  40 +# Obfuscation related
  41 +app.*.map.json
  42 +
  43 +# Exceptions to above rules.
  44 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
  45 +/pubspec.lock
  46 +/ios/Podfile.lock
... ...
README.md 0 → 100644
  1 +++ a/README.md
  1 +# wow_english
  2 +
  3 +A new Flutter project.
  4 +
  5 +## Getting Started
  6 +
  7 +This project is a starting point for a Flutter application.
  8 +
  9 +A few resources to get you started if this is your first Flutter project:
  10 +
  11 +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
  12 +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
  13 +
  14 +For help getting started with Flutter development, view the
  15 +[online documentation](https://docs.flutter.dev/), which offers tutorials,
  16 +samples, guidance on mobile development, and a full API reference.
... ...
analysis_options.yaml 0 → 100644
  1 +++ a/analysis_options.yaml
  1 +# This file configures the analyzer, which statically analyzes Dart code to
  2 +# check for errors, warnings, and lints.
  3 +#
  4 +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
  5 +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
  6 +# invoked from the command line by running `flutter analyze`.
  7 +
  8 +# The following line activates a set of recommended lints for Flutter apps,
  9 +# packages, and plugins designed to encourage good coding practices.
  10 +include: package:flutter_lints/flutter.yaml
  11 +
  12 +linter:
  13 + # The lint rules applied to this project can be customized in the
  14 + # section below to disable rules from the `package:flutter_lints/flutter.yaml`
  15 + # included above or to enable additional rules. A list of all available lints
  16 + # and their documentation is published at
  17 + # https://dart-lang.github.io/linter/lints/index.html.
  18 + #
  19 + # Instead of disabling a lint rule for the entire project in the
  20 + # section below, it can also be suppressed for a single line of code
  21 + # or a specific dart file by using the `// ignore: name_of_lint` and
  22 + # `// ignore_for_file: name_of_lint` syntax on the line or in the file
  23 + # producing the lint.
  24 + rules:
  25 + # avoid_print: false # Uncomment to disable the `avoid_print` rule
  26 + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
  27 +
  28 +# Additional information about this file can be found at
  29 +# https://dart.dev/guides/language/analysis-options
... ...
android/.gitignore 0 → 100644
  1 +++ a/android/.gitignore
  1 +gradle-wrapper.jar
  2 +/.gradle
  3 +/captures/
  4 +/gradlew
  5 +/gradlew.bat
  6 +/local.properties
  7 +GeneratedPluginRegistrant.java
  8 +
  9 +# Remember to never publicly share your keystore.
  10 +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
  11 +key.properties
  12 +**/*.keystore
  13 +**/*.jks
... ...
android/app/build.gradle 0 → 100644
  1 +++ a/android/app/build.gradle
  1 +def localProperties = new Properties()
  2 +def localPropertiesFile = rootProject.file('local.properties')
  3 +if (localPropertiesFile.exists()) {
  4 + localPropertiesFile.withReader('UTF-8') { reader ->
  5 + localProperties.load(reader)
  6 + }
  7 +}
  8 +
  9 +def flutterRoot = localProperties.getProperty('flutter.sdk')
  10 +if (flutterRoot == null) {
  11 + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
  12 +}
  13 +
  14 +def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
  15 +if (flutterVersionCode == null) {
  16 + flutterVersionCode = '1'
  17 +}
  18 +
  19 +def flutterVersionName = localProperties.getProperty('flutter.versionName')
  20 +if (flutterVersionName == null) {
  21 + flutterVersionName = '1.0'
  22 +}
  23 +
  24 +apply plugin: 'com.android.application'
  25 +apply plugin: 'kotlin-android'
  26 +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
  27 +
  28 +android {
  29 + namespace "com.example.wow_english"
  30 + compileSdkVersion flutter.compileSdkVersion
  31 + ndkVersion flutter.ndkVersion
  32 +
  33 + compileOptions {
  34 + sourceCompatibility JavaVersion.VERSION_1_8
  35 + targetCompatibility JavaVersion.VERSION_1_8
  36 + }
  37 +
  38 + kotlinOptions {
  39 + jvmTarget = '1.8'
  40 + }
  41 +
  42 + sourceSets {
  43 + main.java.srcDirs += 'src/main/kotlin'
  44 + }
  45 +
  46 + defaultConfig {
  47 + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
  48 + applicationId "com.example.wow_english"
  49 + // You can update the following values to match your application needs.
  50 + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
  51 + minSdkVersion flutter.minSdkVersion
  52 + targetSdkVersion flutter.targetSdkVersion
  53 + versionCode flutterVersionCode.toInteger()
  54 + versionName flutterVersionName
  55 + }
  56 +
  57 + buildTypes {
  58 + release {
  59 + // TODO: Add your own signing config for the release build.
  60 + // Signing with the debug keys for now, so `flutter run --release` works.
  61 + signingConfig signingConfigs.debug
  62 + }
  63 + }
  64 +}
  65 +
  66 +flutter {
  67 + source '../..'
  68 +}
  69 +
  70 +dependencies {
  71 + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
  72 +}
... ...
android/app/src/debug/AndroidManifest.xml 0 → 100644
  1 +++ a/android/app/src/debug/AndroidManifest.xml
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  2 + <!-- The INTERNET permission is required for development. Specifically,
  3 + the Flutter tool needs it to communicate with the running application
  4 + to allow setting breakpoints, to provide hot reload, etc.
  5 + -->
  6 + <uses-permission android:name="android.permission.INTERNET"/>
  7 +</manifest>
... ...
android/app/src/main/AndroidManifest.xml 0 → 100644
  1 +++ a/android/app/src/main/AndroidManifest.xml
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  2 + <application
  3 + android:label="wow_english"
  4 + android:name="${applicationName}"
  5 + android:icon="@mipmap/ic_launcher">
  6 + <activity
  7 + android:name=".MainActivity"
  8 + android:exported="true"
  9 + android:launchMode="singleTop"
  10 + android:theme="@style/LaunchTheme"
  11 + android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
  12 + android:hardwareAccelerated="true"
  13 + android:windowSoftInputMode="adjustResize">
  14 + <!-- Specifies an Android theme to apply to this Activity as soon as
  15 + the Android process has started. This theme is visible to the user
  16 + while the Flutter UI initializes. After that, this theme continues
  17 + to determine the Window background behind the Flutter UI. -->
  18 + <meta-data
  19 + android:name="io.flutter.embedding.android.NormalTheme"
  20 + android:resource="@style/NormalTheme"
  21 + />
  22 + <intent-filter>
  23 + <action android:name="android.intent.action.MAIN"/>
  24 + <category android:name="android.intent.category.LAUNCHER"/>
  25 + </intent-filter>
  26 + </activity>
  27 + <!-- Don't delete the meta-data below.
  28 + This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
  29 + <meta-data
  30 + android:name="flutterEmbedding"
  31 + android:value="2" />
  32 + </application>
  33 +</manifest>
... ...
android/app/src/main/kotlin/com/example/wow_english/MainActivity.kt 0 → 100644
  1 +++ a/android/app/src/main/kotlin/com/example/wow_english/MainActivity.kt
  1 +package com.example.wow_english
  2 +
  3 +import io.flutter.embedding.android.FlutterActivity
  4 +
  5 +class MainActivity: FlutterActivity() {
  6 +}
... ...
android/app/src/main/res/drawable-v21/launch_background.xml 0 → 100644
  1 +++ a/android/app/src/main/res/drawable-v21/launch_background.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Modify this file to customize your launch splash screen -->
  3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <item android:drawable="?android:colorBackground" />
  5 +
  6 + <!-- You can insert your own image assets here -->
  7 + <!-- <item>
  8 + <bitmap
  9 + android:gravity="center"
  10 + android:src="@mipmap/launch_image" />
  11 + </item> -->
  12 +</layer-list>
... ...
android/app/src/main/res/drawable/launch_background.xml 0 → 100644
  1 +++ a/android/app/src/main/res/drawable/launch_background.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<!-- Modify this file to customize your launch splash screen -->
  3 +<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  4 + <item android:drawable="@android:color/white" />
  5 +
  6 + <!-- You can insert your own image assets here -->
  7 + <!-- <item>
  8 + <bitmap
  9 + android:gravity="center"
  10 + android:src="@mipmap/launch_image" />
  11 + </item> -->
  12 +</layer-list>
... ...
android/app/src/main/res/mipmap-hdpi/ic_launcher.png 0 → 100644

544 Bytes

android/app/src/main/res/mipmap-mdpi/ic_launcher.png 0 → 100644

442 Bytes

android/app/src/main/res/mipmap-xhdpi/ic_launcher.png 0 → 100644

721 Bytes

android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png 0 → 100644

1.01 KB

android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png 0 → 100644

1.41 KB

android/app/src/main/res/values-night/styles.xml 0 → 100644
  1 +++ a/android/app/src/main/res/values-night/styles.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
  4 + <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
  5 + <!-- Show a splash screen on the activity. Automatically removed when
  6 + the Flutter engine draws its first frame -->
  7 + <item name="android:windowBackground">@drawable/launch_background</item>
  8 + </style>
  9 + <!-- Theme applied to the Android Window as soon as the process has started.
  10 + This theme determines the color of the Android Window while your
  11 + Flutter UI initializes, as well as behind your Flutter UI while its
  12 + running.
  13 +
  14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->
  15 + <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
  16 + <item name="android:windowBackground">?android:colorBackground</item>
  17 + </style>
  18 +</resources>
... ...
android/app/src/main/res/values/styles.xml 0 → 100644
  1 +++ a/android/app/src/main/res/values/styles.xml
  1 +<?xml version="1.0" encoding="utf-8"?>
  2 +<resources>
  3 + <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
  4 + <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
  5 + <!-- Show a splash screen on the activity. Automatically removed when
  6 + the Flutter engine draws its first frame -->
  7 + <item name="android:windowBackground">@drawable/launch_background</item>
  8 + </style>
  9 + <!-- Theme applied to the Android Window as soon as the process has started.
  10 + This theme determines the color of the Android Window while your
  11 + Flutter UI initializes, as well as behind your Flutter UI while its
  12 + running.
  13 +
  14 + This Theme is only used starting with V2 of Flutter's Android embedding. -->
  15 + <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
  16 + <item name="android:windowBackground">?android:colorBackground</item>
  17 + </style>
  18 +</resources>
... ...
android/app/src/profile/AndroidManifest.xml 0 → 100644
  1 +++ a/android/app/src/profile/AndroidManifest.xml
  1 +<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  2 + <!-- The INTERNET permission is required for development. Specifically,
  3 + the Flutter tool needs it to communicate with the running application
  4 + to allow setting breakpoints, to provide hot reload, etc.
  5 + -->
  6 + <uses-permission android:name="android.permission.INTERNET"/>
  7 +</manifest>
... ...
android/build.gradle 0 → 100644
  1 +++ a/android/build.gradle
  1 +buildscript {
  2 + ext.kotlin_version = '1.7.10'
  3 + repositories {
  4 + google()
  5 + mavenCentral()
  6 + }
  7 +
  8 + dependencies {
  9 + classpath 'com.android.tools.build:gradle:7.3.0'
  10 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
  11 + }
  12 +}
  13 +
  14 +allprojects {
  15 + repositories {
  16 + google()
  17 + mavenCentral()
  18 + }
  19 +}
  20 +
  21 +rootProject.buildDir = '../build'
  22 +subprojects {
  23 + project.buildDir = "${rootProject.buildDir}/${project.name}"
  24 +}
  25 +subprojects {
  26 + project.evaluationDependsOn(':app')
  27 +}
  28 +
  29 +tasks.register("clean", Delete) {
  30 + delete rootProject.buildDir
  31 +}
... ...
android/gradle.properties 0 → 100644
  1 +++ a/android/gradle.properties
  1 +org.gradle.jvmargs=-Xmx1536M
  2 +android.useAndroidX=true
  3 +android.enableJetifier=true
... ...
android/gradle/wrapper/gradle-wrapper.properties 0 → 100644
  1 +++ a/android/gradle/wrapper/gradle-wrapper.properties
  1 +distributionBase=GRADLE_USER_HOME
  2 +distributionPath=wrapper/dists
  3 +zipStoreBase=GRADLE_USER_HOME
  4 +zipStorePath=wrapper/dists
  5 +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
... ...
android/settings.gradle 0 → 100644
  1 +++ a/android/settings.gradle
  1 +include ':app'
  2 +
  3 +def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
  4 +def properties = new Properties()
  5 +
  6 +assert localPropertiesFile.exists()
  7 +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
  8 +
  9 +def flutterSdkPath = properties.getProperty("flutter.sdk")
  10 +assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
  11 +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
... ...
ios/.gitignore 0 → 100644
  1 +++ a/ios/.gitignore
  1 +**/dgph
  2 +*.mode1v3
  3 +*.mode2v3
  4 +*.moved-aside
  5 +*.pbxuser
  6 +*.perspectivev3
  7 +**/*sync/
  8 +.sconsign.dblite
  9 +.tags*
  10 +**/.vagrant/
  11 +**/DerivedData/
  12 +Icon?
  13 +**/Pods/
  14 +**/.symlinks/
  15 +profile
  16 +xcuserdata
  17 +**/.generated/
  18 +Flutter/App.framework
  19 +Flutter/Flutter.framework
  20 +Flutter/Flutter.podspec
  21 +Flutter/Generated.xcconfig
  22 +Flutter/ephemeral/
  23 +Flutter/app.flx
  24 +Flutter/app.zip
  25 +Flutter/flutter_assets/
  26 +Flutter/flutter_export_environment.sh
  27 +ServiceDefinitions.json
  28 +Runner/GeneratedPluginRegistrant.*
  29 +
  30 +# Exceptions to above rules.
  31 +!default.mode1v3
  32 +!default.mode2v3
  33 +!default.pbxuser
  34 +!default.perspectivev3
... ...
ios/Flutter/AppFrameworkInfo.plist 0 → 100644
  1 +++ a/ios/Flutter/AppFrameworkInfo.plist
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>en</string>
  7 + <key>CFBundleExecutable</key>
  8 + <string>App</string>
  9 + <key>CFBundleIdentifier</key>
  10 + <string>io.flutter.flutter.app</string>
  11 + <key>CFBundleInfoDictionaryVersion</key>
  12 + <string>6.0</string>
  13 + <key>CFBundleName</key>
  14 + <string>App</string>
  15 + <key>CFBundlePackageType</key>
  16 + <string>FMWK</string>
  17 + <key>CFBundleShortVersionString</key>
  18 + <string>1.0</string>
  19 + <key>CFBundleSignature</key>
  20 + <string>????</string>
  21 + <key>CFBundleVersion</key>
  22 + <string>1.0</string>
  23 + <key>MinimumOSVersion</key>
  24 + <string>11.0</string>
  25 +</dict>
  26 +</plist>
... ...
ios/Flutter/Debug.xcconfig 0 → 100644
  1 +++ a/ios/Flutter/Debug.xcconfig
  1 +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
  2 +#include "Generated.xcconfig"
... ...
ios/Flutter/Release.xcconfig 0 → 100644
  1 +++ a/ios/Flutter/Release.xcconfig
  1 +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
  2 +#include "Generated.xcconfig"
... ...
ios/Podfile 0 → 100644
  1 +++ a/ios/Podfile
  1 +# Uncomment this line to define a global platform for your project
  2 +# platform :ios, '11.0'
  3 +
  4 +# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
  5 +ENV['COCOAPODS_DISABLE_STATS'] = 'true'
  6 +
  7 +project 'Runner', {
  8 + 'Debug' => :debug,
  9 + 'Profile' => :release,
  10 + 'Release' => :release,
  11 +}
  12 +
  13 +def flutter_root
  14 + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  15 + unless File.exist?(generated_xcode_build_settings_path)
  16 + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  17 + end
  18 +
  19 + File.foreach(generated_xcode_build_settings_path) do |line|
  20 + matches = line.match(/FLUTTER_ROOT\=(.*)/)
  21 + return matches[1].strip if matches
  22 + end
  23 + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
  24 +end
  25 +
  26 +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
  27 +
  28 +flutter_ios_podfile_setup
  29 +
  30 +target 'Runner' do
  31 + use_frameworks!
  32 + use_modular_headers!
  33 +
  34 + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
  35 + target 'RunnerTests' do
  36 + inherit! :search_paths
  37 + end
  38 +end
  39 +
  40 +post_install do |installer|
  41 + installer.pods_project.targets.each do |target|
  42 + flutter_additional_ios_build_settings(target)
  43 + end
  44 +end
... ...
ios/Runner.xcodeproj/project.pbxproj 0 → 100644
  1 +++ a/ios/Runner.xcodeproj/project.pbxproj
  1 +// !$*UTF8*$!
  2 +{
  3 + archiveVersion = 1;
  4 + classes = {
  5 + };
  6 + objectVersion = 54;
  7 + objects = {
  8 +
  9 +/* Begin PBXBuildFile section */
  10 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
  11 + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
  12 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
  13 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
  14 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
  15 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
  16 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
  17 + F5FCE34FB9E028C20A7850DE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A3DBEAB6142776646A34D9C /* Pods_RunnerTests.framework */; };
  18 + FB8AFCB0A8C34B5508A68F45 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DEBBC1D861BE053F3ECE0B9 /* Pods_Runner.framework */; };
  19 +/* End PBXBuildFile section */
  20 +
  21 +/* Begin PBXContainerItemProxy section */
  22 + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
  23 + isa = PBXContainerItemProxy;
  24 + containerPortal = 97C146E61CF9000F007C117D /* Project object */;
  25 + proxyType = 1;
  26 + remoteGlobalIDString = 97C146ED1CF9000F007C117D;
  27 + remoteInfo = Runner;
  28 + };
  29 +/* End PBXContainerItemProxy section */
  30 +
  31 +/* Begin PBXCopyFilesBuildPhase section */
  32 + 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
  33 + isa = PBXCopyFilesBuildPhase;
  34 + buildActionMask = 2147483647;
  35 + dstPath = "";
  36 + dstSubfolderSpec = 10;
  37 + files = (
  38 + );
  39 + name = "Embed Frameworks";
  40 + runOnlyForDeploymentPostprocessing = 0;
  41 + };
  42 +/* End PBXCopyFilesBuildPhase section */
  43 +
  44 +/* Begin PBXFileReference section */
  45 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
  46 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
  47 + 2A3DBEAB6142776646A34D9C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  48 + 2DE9FE013448D0821175591C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
  49 + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
  50 + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
  51 + 3563EC8D55A646823FD26A83 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
  52 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
  53 + 48BCA0827DCB98991774F5AC /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
  54 + 6DEBBC1D861BE053F3ECE0B9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
  55 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
  56 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
  57 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
  58 + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
  59 + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
  60 + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
  61 + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
  62 + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
  63 + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
  64 + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
  65 + D63F3847140160A2204489BA /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
  66 + D8C046A1A9C279FDBB5C174E /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
  67 + F04D1DAE6591EAD461CBBE9A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
  68 +/* End PBXFileReference section */
  69 +
  70 +/* Begin PBXFrameworksBuildPhase section */
  71 + 97C146EB1CF9000F007C117D /* Frameworks */ = {
  72 + isa = PBXFrameworksBuildPhase;
  73 + buildActionMask = 2147483647;
  74 + files = (
  75 + FB8AFCB0A8C34B5508A68F45 /* Pods_Runner.framework in Frameworks */,
  76 + );
  77 + runOnlyForDeploymentPostprocessing = 0;
  78 + };
  79 + C23E992F6BFFE604720B1F08 /* Frameworks */ = {
  80 + isa = PBXFrameworksBuildPhase;
  81 + buildActionMask = 2147483647;
  82 + files = (
  83 + F5FCE34FB9E028C20A7850DE /* Pods_RunnerTests.framework in Frameworks */,
  84 + );
  85 + runOnlyForDeploymentPostprocessing = 0;
  86 + };
  87 +/* End PBXFrameworksBuildPhase section */
  88 +
  89 +/* Begin PBXGroup section */
  90 + 331C8082294A63A400263BE5 /* RunnerTests */ = {
  91 + isa = PBXGroup;
  92 + children = (
  93 + 331C807B294A618700263BE5 /* RunnerTests.swift */,
  94 + );
  95 + path = RunnerTests;
  96 + sourceTree = "<group>";
  97 + };
  98 + 340CE8403EC22FE8EE1FA3EF /* Pods */ = {
  99 + isa = PBXGroup;
  100 + children = (
  101 + F04D1DAE6591EAD461CBBE9A /* Pods-Runner.debug.xcconfig */,
  102 + 3563EC8D55A646823FD26A83 /* Pods-Runner.release.xcconfig */,
  103 + 2DE9FE013448D0821175591C /* Pods-Runner.profile.xcconfig */,
  104 + D63F3847140160A2204489BA /* Pods-RunnerTests.debug.xcconfig */,
  105 + D8C046A1A9C279FDBB5C174E /* Pods-RunnerTests.release.xcconfig */,
  106 + 48BCA0827DCB98991774F5AC /* Pods-RunnerTests.profile.xcconfig */,
  107 + );
  108 + name = Pods;
  109 + path = Pods;
  110 + sourceTree = "<group>";
  111 + };
  112 + 9740EEB11CF90186004384FC /* Flutter */ = {
  113 + isa = PBXGroup;
  114 + children = (
  115 + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
  116 + 9740EEB21CF90195004384FC /* Debug.xcconfig */,
  117 + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
  118 + 9740EEB31CF90195004384FC /* Generated.xcconfig */,
  119 + );
  120 + name = Flutter;
  121 + sourceTree = "<group>";
  122 + };
  123 + 97C146E51CF9000F007C117D = {
  124 + isa = PBXGroup;
  125 + children = (
  126 + 9740EEB11CF90186004384FC /* Flutter */,
  127 + 97C146F01CF9000F007C117D /* Runner */,
  128 + 97C146EF1CF9000F007C117D /* Products */,
  129 + 331C8082294A63A400263BE5 /* RunnerTests */,
  130 + 340CE8403EC22FE8EE1FA3EF /* Pods */,
  131 + E653501EF99460B1BB76C5EE /* Frameworks */,
  132 + );
  133 + sourceTree = "<group>";
  134 + };
  135 + 97C146EF1CF9000F007C117D /* Products */ = {
  136 + isa = PBXGroup;
  137 + children = (
  138 + 97C146EE1CF9000F007C117D /* Runner.app */,
  139 + 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
  140 + );
  141 + name = Products;
  142 + sourceTree = "<group>";
  143 + };
  144 + 97C146F01CF9000F007C117D /* Runner */ = {
  145 + isa = PBXGroup;
  146 + children = (
  147 + 97C146FA1CF9000F007C117D /* Main.storyboard */,
  148 + 97C146FD1CF9000F007C117D /* Assets.xcassets */,
  149 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
  150 + 97C147021CF9000F007C117D /* Info.plist */,
  151 + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
  152 + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
  153 + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
  154 + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
  155 + );
  156 + path = Runner;
  157 + sourceTree = "<group>";
  158 + };
  159 + E653501EF99460B1BB76C5EE /* Frameworks */ = {
  160 + isa = PBXGroup;
  161 + children = (
  162 + 6DEBBC1D861BE053F3ECE0B9 /* Pods_Runner.framework */,
  163 + 2A3DBEAB6142776646A34D9C /* Pods_RunnerTests.framework */,
  164 + );
  165 + name = Frameworks;
  166 + sourceTree = "<group>";
  167 + };
  168 +/* End PBXGroup section */
  169 +
  170 +/* Begin PBXNativeTarget section */
  171 + 331C8080294A63A400263BE5 /* RunnerTests */ = {
  172 + isa = PBXNativeTarget;
  173 + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
  174 + buildPhases = (
  175 + 1848D46A0D409EBE27D32427 /* [CP] Check Pods Manifest.lock */,
  176 + 331C807D294A63A400263BE5 /* Sources */,
  177 + 331C807F294A63A400263BE5 /* Resources */,
  178 + C23E992F6BFFE604720B1F08 /* Frameworks */,
  179 + );
  180 + buildRules = (
  181 + );
  182 + dependencies = (
  183 + 331C8086294A63A400263BE5 /* PBXTargetDependency */,
  184 + );
  185 + name = RunnerTests;
  186 + productName = RunnerTests;
  187 + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
  188 + productType = "com.apple.product-type.bundle.unit-test";
  189 + };
  190 + 97C146ED1CF9000F007C117D /* Runner */ = {
  191 + isa = PBXNativeTarget;
  192 + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
  193 + buildPhases = (
  194 + 8ED1E6CFA81B97851609A01C /* [CP] Check Pods Manifest.lock */,
  195 + 9740EEB61CF901F6004384FC /* Run Script */,
  196 + 97C146EA1CF9000F007C117D /* Sources */,
  197 + 97C146EB1CF9000F007C117D /* Frameworks */,
  198 + 97C146EC1CF9000F007C117D /* Resources */,
  199 + 9705A1C41CF9048500538489 /* Embed Frameworks */,
  200 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
  201 + 7C15D12B84189A796384E28E /* [CP] Embed Pods Frameworks */,
  202 + );
  203 + buildRules = (
  204 + );
  205 + dependencies = (
  206 + );
  207 + name = Runner;
  208 + productName = Runner;
  209 + productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
  210 + productType = "com.apple.product-type.application";
  211 + };
  212 +/* End PBXNativeTarget section */
  213 +
  214 +/* Begin PBXProject section */
  215 + 97C146E61CF9000F007C117D /* Project object */ = {
  216 + isa = PBXProject;
  217 + attributes = {
  218 + LastUpgradeCheck = 1300;
  219 + ORGANIZATIONNAME = "";
  220 + TargetAttributes = {
  221 + 331C8080294A63A400263BE5 = {
  222 + CreatedOnToolsVersion = 14.0;
  223 + TestTargetID = 97C146ED1CF9000F007C117D;
  224 + };
  225 + 97C146ED1CF9000F007C117D = {
  226 + CreatedOnToolsVersion = 7.3.1;
  227 + LastSwiftMigration = 1100;
  228 + };
  229 + };
  230 + };
  231 + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
  232 + compatibilityVersion = "Xcode 9.3";
  233 + developmentRegion = en;
  234 + hasScannedForEncodings = 0;
  235 + knownRegions = (
  236 + en,
  237 + Base,
  238 + );
  239 + mainGroup = 97C146E51CF9000F007C117D;
  240 + productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
  241 + projectDirPath = "";
  242 + projectRoot = "";
  243 + targets = (
  244 + 97C146ED1CF9000F007C117D /* Runner */,
  245 + 331C8080294A63A400263BE5 /* RunnerTests */,
  246 + );
  247 + };
  248 +/* End PBXProject section */
  249 +
  250 +/* Begin PBXResourcesBuildPhase section */
  251 + 331C807F294A63A400263BE5 /* Resources */ = {
  252 + isa = PBXResourcesBuildPhase;
  253 + buildActionMask = 2147483647;
  254 + files = (
  255 + );
  256 + runOnlyForDeploymentPostprocessing = 0;
  257 + };
  258 + 97C146EC1CF9000F007C117D /* Resources */ = {
  259 + isa = PBXResourcesBuildPhase;
  260 + buildActionMask = 2147483647;
  261 + files = (
  262 + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
  263 + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
  264 + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
  265 + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
  266 + );
  267 + runOnlyForDeploymentPostprocessing = 0;
  268 + };
  269 +/* End PBXResourcesBuildPhase section */
  270 +
  271 +/* Begin PBXShellScriptBuildPhase section */
  272 + 1848D46A0D409EBE27D32427 /* [CP] Check Pods Manifest.lock */ = {
  273 + isa = PBXShellScriptBuildPhase;
  274 + buildActionMask = 2147483647;
  275 + files = (
  276 + );
  277 + inputFileListPaths = (
  278 + );
  279 + inputPaths = (
  280 + "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
  281 + "${PODS_ROOT}/Manifest.lock",
  282 + );
  283 + name = "[CP] Check Pods Manifest.lock";
  284 + outputFileListPaths = (
  285 + );
  286 + outputPaths = (
  287 + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
  288 + );
  289 + runOnlyForDeploymentPostprocessing = 0;
  290 + shellPath = /bin/sh;
  291 + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
  292 + showEnvVarsInLog = 0;
  293 + };
  294 + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
  295 + isa = PBXShellScriptBuildPhase;
  296 + alwaysOutOfDate = 1;
  297 + buildActionMask = 2147483647;
  298 + files = (
  299 + );
  300 + inputPaths = (
  301 + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
  302 + );
  303 + name = "Thin Binary";
  304 + outputPaths = (
  305 + );
  306 + runOnlyForDeploymentPostprocessing = 0;
  307 + shellPath = /bin/sh;
  308 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
  309 + };
  310 + 7C15D12B84189A796384E28E /* [CP] Embed Pods Frameworks */ = {
  311 + isa = PBXShellScriptBuildPhase;
  312 + buildActionMask = 2147483647;
  313 + files = (
  314 + );
  315 + inputFileListPaths = (
  316 + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
  317 + );
  318 + name = "[CP] Embed Pods Frameworks";
  319 + outputFileListPaths = (
  320 + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
  321 + );
  322 + runOnlyForDeploymentPostprocessing = 0;
  323 + shellPath = /bin/sh;
  324 + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
  325 + showEnvVarsInLog = 0;
  326 + };
  327 + 8ED1E6CFA81B97851609A01C /* [CP] Check Pods Manifest.lock */ = {
  328 + isa = PBXShellScriptBuildPhase;
  329 + buildActionMask = 2147483647;
  330 + files = (
  331 + );
  332 + inputFileListPaths = (
  333 + );
  334 + inputPaths = (
  335 + "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
  336 + "${PODS_ROOT}/Manifest.lock",
  337 + );
  338 + name = "[CP] Check Pods Manifest.lock";
  339 + outputFileListPaths = (
  340 + );
  341 + outputPaths = (
  342 + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
  343 + );
  344 + runOnlyForDeploymentPostprocessing = 0;
  345 + shellPath = /bin/sh;
  346 + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
  347 + showEnvVarsInLog = 0;
  348 + };
  349 + 9740EEB61CF901F6004384FC /* Run Script */ = {
  350 + isa = PBXShellScriptBuildPhase;
  351 + alwaysOutOfDate = 1;
  352 + buildActionMask = 2147483647;
  353 + files = (
  354 + );
  355 + inputPaths = (
  356 + );
  357 + name = "Run Script";
  358 + outputPaths = (
  359 + );
  360 + runOnlyForDeploymentPostprocessing = 0;
  361 + shellPath = /bin/sh;
  362 + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
  363 + };
  364 +/* End PBXShellScriptBuildPhase section */
  365 +
  366 +/* Begin PBXSourcesBuildPhase section */
  367 + 331C807D294A63A400263BE5 /* Sources */ = {
  368 + isa = PBXSourcesBuildPhase;
  369 + buildActionMask = 2147483647;
  370 + files = (
  371 + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
  372 + );
  373 + runOnlyForDeploymentPostprocessing = 0;
  374 + };
  375 + 97C146EA1CF9000F007C117D /* Sources */ = {
  376 + isa = PBXSourcesBuildPhase;
  377 + buildActionMask = 2147483647;
  378 + files = (
  379 + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
  380 + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
  381 + );
  382 + runOnlyForDeploymentPostprocessing = 0;
  383 + };
  384 +/* End PBXSourcesBuildPhase section */
  385 +
  386 +/* Begin PBXTargetDependency section */
  387 + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
  388 + isa = PBXTargetDependency;
  389 + target = 97C146ED1CF9000F007C117D /* Runner */;
  390 + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
  391 + };
  392 +/* End PBXTargetDependency section */
  393 +
  394 +/* Begin PBXVariantGroup section */
  395 + 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
  396 + isa = PBXVariantGroup;
  397 + children = (
  398 + 97C146FB1CF9000F007C117D /* Base */,
  399 + );
  400 + name = Main.storyboard;
  401 + sourceTree = "<group>";
  402 + };
  403 + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
  404 + isa = PBXVariantGroup;
  405 + children = (
  406 + 97C147001CF9000F007C117D /* Base */,
  407 + );
  408 + name = LaunchScreen.storyboard;
  409 + sourceTree = "<group>";
  410 + };
  411 +/* End PBXVariantGroup section */
  412 +
  413 +/* Begin XCBuildConfiguration section */
  414 + 249021D3217E4FDB00AE95B9 /* Profile */ = {
  415 + isa = XCBuildConfiguration;
  416 + buildSettings = {
  417 + ALWAYS_SEARCH_USER_PATHS = NO;
  418 + CLANG_ANALYZER_NONNULL = YES;
  419 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  420 + CLANG_CXX_LIBRARY = "libc++";
  421 + CLANG_ENABLE_MODULES = YES;
  422 + CLANG_ENABLE_OBJC_ARC = YES;
  423 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  424 + CLANG_WARN_BOOL_CONVERSION = YES;
  425 + CLANG_WARN_COMMA = YES;
  426 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  427 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  428 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  429 + CLANG_WARN_EMPTY_BODY = YES;
  430 + CLANG_WARN_ENUM_CONVERSION = YES;
  431 + CLANG_WARN_INFINITE_RECURSION = YES;
  432 + CLANG_WARN_INT_CONVERSION = YES;
  433 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  434 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  435 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  436 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  437 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  438 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  439 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  440 + CLANG_WARN_UNREACHABLE_CODE = YES;
  441 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  442 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  443 + COPY_PHASE_STRIP = NO;
  444 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  445 + ENABLE_NS_ASSERTIONS = NO;
  446 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  447 + GCC_C_LANGUAGE_STANDARD = gnu99;
  448 + GCC_NO_COMMON_BLOCKS = YES;
  449 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  450 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  451 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  452 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  453 + GCC_WARN_UNUSED_FUNCTION = YES;
  454 + GCC_WARN_UNUSED_VARIABLE = YES;
  455 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  456 + MTL_ENABLE_DEBUG_INFO = NO;
  457 + SDKROOT = iphoneos;
  458 + SUPPORTED_PLATFORMS = iphoneos;
  459 + TARGETED_DEVICE_FAMILY = "1,2";
  460 + VALIDATE_PRODUCT = YES;
  461 + };
  462 + name = Profile;
  463 + };
  464 + 249021D4217E4FDB00AE95B9 /* Profile */ = {
  465 + isa = XCBuildConfiguration;
  466 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  467 + buildSettings = {
  468 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  469 + CLANG_ENABLE_MODULES = YES;
  470 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  471 + DEVELOPMENT_TEAM = 6537XPMMG6;
  472 + ENABLE_BITCODE = NO;
  473 + INFOPLIST_FILE = Runner/Info.plist;
  474 + LD_RUNPATH_SEARCH_PATHS = (
  475 + "$(inherited)",
  476 + "@executable_path/Frameworks",
  477 + );
  478 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish;
  479 + PRODUCT_NAME = "$(TARGET_NAME)";
  480 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  481 + SWIFT_VERSION = 5.0;
  482 + VERSIONING_SYSTEM = "apple-generic";
  483 + };
  484 + name = Profile;
  485 + };
  486 + 331C8088294A63A400263BE5 /* Debug */ = {
  487 + isa = XCBuildConfiguration;
  488 + baseConfigurationReference = D63F3847140160A2204489BA /* Pods-RunnerTests.debug.xcconfig */;
  489 + buildSettings = {
  490 + BUNDLE_LOADER = "$(TEST_HOST)";
  491 + CODE_SIGN_STYLE = Automatic;
  492 + CURRENT_PROJECT_VERSION = 1;
  493 + GENERATE_INFOPLIST_FILE = YES;
  494 + MARKETING_VERSION = 1.0;
  495 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish.RunnerTests;
  496 + PRODUCT_NAME = "$(TARGET_NAME)";
  497 + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
  498 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  499 + SWIFT_VERSION = 5.0;
  500 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
  501 + };
  502 + name = Debug;
  503 + };
  504 + 331C8089294A63A400263BE5 /* Release */ = {
  505 + isa = XCBuildConfiguration;
  506 + baseConfigurationReference = D8C046A1A9C279FDBB5C174E /* Pods-RunnerTests.release.xcconfig */;
  507 + buildSettings = {
  508 + BUNDLE_LOADER = "$(TEST_HOST)";
  509 + CODE_SIGN_STYLE = Automatic;
  510 + CURRENT_PROJECT_VERSION = 1;
  511 + GENERATE_INFOPLIST_FILE = YES;
  512 + MARKETING_VERSION = 1.0;
  513 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish.RunnerTests;
  514 + PRODUCT_NAME = "$(TARGET_NAME)";
  515 + SWIFT_VERSION = 5.0;
  516 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
  517 + };
  518 + name = Release;
  519 + };
  520 + 331C808A294A63A400263BE5 /* Profile */ = {
  521 + isa = XCBuildConfiguration;
  522 + baseConfigurationReference = 48BCA0827DCB98991774F5AC /* Pods-RunnerTests.profile.xcconfig */;
  523 + buildSettings = {
  524 + BUNDLE_LOADER = "$(TEST_HOST)";
  525 + CODE_SIGN_STYLE = Automatic;
  526 + CURRENT_PROJECT_VERSION = 1;
  527 + GENERATE_INFOPLIST_FILE = YES;
  528 + MARKETING_VERSION = 1.0;
  529 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish.RunnerTests;
  530 + PRODUCT_NAME = "$(TARGET_NAME)";
  531 + SWIFT_VERSION = 5.0;
  532 + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
  533 + };
  534 + name = Profile;
  535 + };
  536 + 97C147031CF9000F007C117D /* Debug */ = {
  537 + isa = XCBuildConfiguration;
  538 + buildSettings = {
  539 + ALWAYS_SEARCH_USER_PATHS = NO;
  540 + CLANG_ANALYZER_NONNULL = YES;
  541 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  542 + CLANG_CXX_LIBRARY = "libc++";
  543 + CLANG_ENABLE_MODULES = YES;
  544 + CLANG_ENABLE_OBJC_ARC = YES;
  545 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  546 + CLANG_WARN_BOOL_CONVERSION = YES;
  547 + CLANG_WARN_COMMA = YES;
  548 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  549 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  550 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  551 + CLANG_WARN_EMPTY_BODY = YES;
  552 + CLANG_WARN_ENUM_CONVERSION = YES;
  553 + CLANG_WARN_INFINITE_RECURSION = YES;
  554 + CLANG_WARN_INT_CONVERSION = YES;
  555 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  556 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  557 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  558 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  559 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  560 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  561 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  562 + CLANG_WARN_UNREACHABLE_CODE = YES;
  563 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  564 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  565 + COPY_PHASE_STRIP = NO;
  566 + DEBUG_INFORMATION_FORMAT = dwarf;
  567 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  568 + ENABLE_TESTABILITY = YES;
  569 + GCC_C_LANGUAGE_STANDARD = gnu99;
  570 + GCC_DYNAMIC_NO_PIC = NO;
  571 + GCC_NO_COMMON_BLOCKS = YES;
  572 + GCC_OPTIMIZATION_LEVEL = 0;
  573 + GCC_PREPROCESSOR_DEFINITIONS = (
  574 + "DEBUG=1",
  575 + "$(inherited)",
  576 + );
  577 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  578 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  579 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  580 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  581 + GCC_WARN_UNUSED_FUNCTION = YES;
  582 + GCC_WARN_UNUSED_VARIABLE = YES;
  583 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  584 + MTL_ENABLE_DEBUG_INFO = YES;
  585 + ONLY_ACTIVE_ARCH = YES;
  586 + SDKROOT = iphoneos;
  587 + TARGETED_DEVICE_FAMILY = "1,2";
  588 + };
  589 + name = Debug;
  590 + };
  591 + 97C147041CF9000F007C117D /* Release */ = {
  592 + isa = XCBuildConfiguration;
  593 + buildSettings = {
  594 + ALWAYS_SEARCH_USER_PATHS = NO;
  595 + CLANG_ANALYZER_NONNULL = YES;
  596 + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
  597 + CLANG_CXX_LIBRARY = "libc++";
  598 + CLANG_ENABLE_MODULES = YES;
  599 + CLANG_ENABLE_OBJC_ARC = YES;
  600 + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
  601 + CLANG_WARN_BOOL_CONVERSION = YES;
  602 + CLANG_WARN_COMMA = YES;
  603 + CLANG_WARN_CONSTANT_CONVERSION = YES;
  604 + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
  605 + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
  606 + CLANG_WARN_EMPTY_BODY = YES;
  607 + CLANG_WARN_ENUM_CONVERSION = YES;
  608 + CLANG_WARN_INFINITE_RECURSION = YES;
  609 + CLANG_WARN_INT_CONVERSION = YES;
  610 + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
  611 + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
  612 + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
  613 + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
  614 + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
  615 + CLANG_WARN_STRICT_PROTOTYPES = YES;
  616 + CLANG_WARN_SUSPICIOUS_MOVE = YES;
  617 + CLANG_WARN_UNREACHABLE_CODE = YES;
  618 + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
  619 + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
  620 + COPY_PHASE_STRIP = NO;
  621 + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
  622 + ENABLE_NS_ASSERTIONS = NO;
  623 + ENABLE_STRICT_OBJC_MSGSEND = YES;
  624 + GCC_C_LANGUAGE_STANDARD = gnu99;
  625 + GCC_NO_COMMON_BLOCKS = YES;
  626 + GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
  627 + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
  628 + GCC_WARN_UNDECLARED_SELECTOR = YES;
  629 + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
  630 + GCC_WARN_UNUSED_FUNCTION = YES;
  631 + GCC_WARN_UNUSED_VARIABLE = YES;
  632 + IPHONEOS_DEPLOYMENT_TARGET = 11.0;
  633 + MTL_ENABLE_DEBUG_INFO = NO;
  634 + SDKROOT = iphoneos;
  635 + SUPPORTED_PLATFORMS = iphoneos;
  636 + SWIFT_COMPILATION_MODE = wholemodule;
  637 + SWIFT_OPTIMIZATION_LEVEL = "-O";
  638 + TARGETED_DEVICE_FAMILY = "1,2";
  639 + VALIDATE_PRODUCT = YES;
  640 + };
  641 + name = Release;
  642 + };
  643 + 97C147061CF9000F007C117D /* Debug */ = {
  644 + isa = XCBuildConfiguration;
  645 + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
  646 + buildSettings = {
  647 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  648 + CLANG_ENABLE_MODULES = YES;
  649 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  650 + DEVELOPMENT_TEAM = 6537XPMMG6;
  651 + ENABLE_BITCODE = NO;
  652 + INFOPLIST_FILE = Runner/Info.plist;
  653 + LD_RUNPATH_SEARCH_PATHS = (
  654 + "$(inherited)",
  655 + "@executable_path/Frameworks",
  656 + );
  657 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish;
  658 + PRODUCT_NAME = "$(TARGET_NAME)";
  659 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  660 + SWIFT_OPTIMIZATION_LEVEL = "-Onone";
  661 + SWIFT_VERSION = 5.0;
  662 + VERSIONING_SYSTEM = "apple-generic";
  663 + };
  664 + name = Debug;
  665 + };
  666 + 97C147071CF9000F007C117D /* Release */ = {
  667 + isa = XCBuildConfiguration;
  668 + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
  669 + buildSettings = {
  670 + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
  671 + CLANG_ENABLE_MODULES = YES;
  672 + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
  673 + DEVELOPMENT_TEAM = 6537XPMMG6;
  674 + ENABLE_BITCODE = NO;
  675 + INFOPLIST_FILE = Runner/Info.plist;
  676 + LD_RUNPATH_SEARCH_PATHS = (
  677 + "$(inherited)",
  678 + "@executable_path/Frameworks",
  679 + );
  680 + PRODUCT_BUNDLE_IDENTIFIER = com.example.wowEnglish;
  681 + PRODUCT_NAME = "$(TARGET_NAME)";
  682 + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
  683 + SWIFT_VERSION = 5.0;
  684 + VERSIONING_SYSTEM = "apple-generic";
  685 + };
  686 + name = Release;
  687 + };
  688 +/* End XCBuildConfiguration section */
  689 +
  690 +/* Begin XCConfigurationList section */
  691 + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
  692 + isa = XCConfigurationList;
  693 + buildConfigurations = (
  694 + 331C8088294A63A400263BE5 /* Debug */,
  695 + 331C8089294A63A400263BE5 /* Release */,
  696 + 331C808A294A63A400263BE5 /* Profile */,
  697 + );
  698 + defaultConfigurationIsVisible = 0;
  699 + defaultConfigurationName = Release;
  700 + };
  701 + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
  702 + isa = XCConfigurationList;
  703 + buildConfigurations = (
  704 + 97C147031CF9000F007C117D /* Debug */,
  705 + 97C147041CF9000F007C117D /* Release */,
  706 + 249021D3217E4FDB00AE95B9 /* Profile */,
  707 + );
  708 + defaultConfigurationIsVisible = 0;
  709 + defaultConfigurationName = Release;
  710 + };
  711 + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
  712 + isa = XCConfigurationList;
  713 + buildConfigurations = (
  714 + 97C147061CF9000F007C117D /* Debug */,
  715 + 97C147071CF9000F007C117D /* Release */,
  716 + 249021D4217E4FDB00AE95B9 /* Profile */,
  717 + );
  718 + defaultConfigurationIsVisible = 0;
  719 + defaultConfigurationName = Release;
  720 + };
  721 +/* End XCConfigurationList section */
  722 + };
  723 + rootObject = 97C146E61CF9000F007C117D /* Project object */;
  724 +}
... ...
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata 0 → 100644
  1 +++ a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "self:">
  6 + </FileRef>
  7 +</Workspace>
... ...
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist 0 → 100644
  1 +++ a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
... ...
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings 0 → 100644
  1 +++ a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>PreviewsEnabled</key>
  6 + <false/>
  7 +</dict>
  8 +</plist>
... ...
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme 0 → 100644
  1 +++ a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Scheme
  3 + LastUpgradeVersion = "1300"
  4 + version = "1.3">
  5 + <BuildAction
  6 + parallelizeBuildables = "YES"
  7 + buildImplicitDependencies = "YES">
  8 + <BuildActionEntries>
  9 + <BuildActionEntry
  10 + buildForTesting = "YES"
  11 + buildForRunning = "YES"
  12 + buildForProfiling = "YES"
  13 + buildForArchiving = "YES"
  14 + buildForAnalyzing = "YES">
  15 + <BuildableReference
  16 + BuildableIdentifier = "primary"
  17 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  18 + BuildableName = "Runner.app"
  19 + BlueprintName = "Runner"
  20 + ReferencedContainer = "container:Runner.xcodeproj">
  21 + </BuildableReference>
  22 + </BuildActionEntry>
  23 + </BuildActionEntries>
  24 + </BuildAction>
  25 + <TestAction
  26 + buildConfiguration = "Debug"
  27 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  28 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  29 + shouldUseLaunchSchemeArgsEnv = "YES">
  30 + <MacroExpansion>
  31 + <BuildableReference
  32 + BuildableIdentifier = "primary"
  33 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  34 + BuildableName = "Runner.app"
  35 + BlueprintName = "Runner"
  36 + ReferencedContainer = "container:Runner.xcodeproj">
  37 + </BuildableReference>
  38 + </MacroExpansion>
  39 + <Testables>
  40 + <TestableReference
  41 + skipped = "NO"
  42 + parallelizable = "YES">
  43 + <BuildableReference
  44 + BuildableIdentifier = "primary"
  45 + BlueprintIdentifier = "331C8080294A63A400263BE5"
  46 + BuildableName = "RunnerTests.xctest"
  47 + BlueprintName = "RunnerTests"
  48 + ReferencedContainer = "container:Runner.xcodeproj">
  49 + </BuildableReference>
  50 + </TestableReference>
  51 + </Testables>
  52 + </TestAction>
  53 + <LaunchAction
  54 + buildConfiguration = "Debug"
  55 + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
  56 + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
  57 + launchStyle = "0"
  58 + useCustomWorkingDirectory = "NO"
  59 + ignoresPersistentStateOnLaunch = "NO"
  60 + debugDocumentVersioning = "YES"
  61 + debugServiceExtension = "internal"
  62 + allowLocationSimulation = "YES">
  63 + <BuildableProductRunnable
  64 + runnableDebuggingMode = "0">
  65 + <BuildableReference
  66 + BuildableIdentifier = "primary"
  67 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  68 + BuildableName = "Runner.app"
  69 + BlueprintName = "Runner"
  70 + ReferencedContainer = "container:Runner.xcodeproj">
  71 + </BuildableReference>
  72 + </BuildableProductRunnable>
  73 + </LaunchAction>
  74 + <ProfileAction
  75 + buildConfiguration = "Profile"
  76 + shouldUseLaunchSchemeArgsEnv = "YES"
  77 + savedToolIdentifier = ""
  78 + useCustomWorkingDirectory = "NO"
  79 + debugDocumentVersioning = "YES">
  80 + <BuildableProductRunnable
  81 + runnableDebuggingMode = "0">
  82 + <BuildableReference
  83 + BuildableIdentifier = "primary"
  84 + BlueprintIdentifier = "97C146ED1CF9000F007C117D"
  85 + BuildableName = "Runner.app"
  86 + BlueprintName = "Runner"
  87 + ReferencedContainer = "container:Runner.xcodeproj">
  88 + </BuildableReference>
  89 + </BuildableProductRunnable>
  90 + </ProfileAction>
  91 + <AnalyzeAction
  92 + buildConfiguration = "Debug">
  93 + </AnalyzeAction>
  94 + <ArchiveAction
  95 + buildConfiguration = "Release"
  96 + revealArchiveInOrganizer = "YES">
  97 + </ArchiveAction>
  98 +</Scheme>
... ...
ios/Runner.xcworkspace/contents.xcworkspacedata 0 → 100644
  1 +++ a/ios/Runner.xcworkspace/contents.xcworkspacedata
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<Workspace
  3 + version = "1.0">
  4 + <FileRef
  5 + location = "group:Runner.xcodeproj">
  6 + </FileRef>
  7 + <FileRef
  8 + location = "group:Pods/Pods.xcodeproj">
  9 + </FileRef>
  10 +</Workspace>
... ...
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist 0 → 100644
  1 +++ a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>IDEDidComputeMac32BitWarning</key>
  6 + <true/>
  7 +</dict>
  8 +</plist>
... ...
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings 0 → 100644
  1 +++ a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>PreviewsEnabled</key>
  6 + <false/>
  7 +</dict>
  8 +</plist>
... ...
ios/Runner/AppDelegate.swift 0 → 100644
  1 +++ a/ios/Runner/AppDelegate.swift
  1 +import UIKit
  2 +import Flutter
  3 +
  4 +@UIApplicationMain
  5 +@objc class AppDelegate: FlutterAppDelegate {
  6 + override func application(
  7 + _ application: UIApplication,
  8 + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  9 + ) -> Bool {
  10 + GeneratedPluginRegistrant.register(with: self)
  11 + return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  12 + }
  13 +}
... ...
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json 0 → 100644
  1 +++ a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  1 +{
  2 + "images" : [
  3 + {
  4 + "size" : "20x20",
  5 + "idiom" : "iphone",
  6 + "filename" : "Icon-App-20x20@2x.png",
  7 + "scale" : "2x"
  8 + },
  9 + {
  10 + "size" : "20x20",
  11 + "idiom" : "iphone",
  12 + "filename" : "Icon-App-20x20@3x.png",
  13 + "scale" : "3x"
  14 + },
  15 + {
  16 + "size" : "29x29",
  17 + "idiom" : "iphone",
  18 + "filename" : "Icon-App-29x29@1x.png",
  19 + "scale" : "1x"
  20 + },
  21 + {
  22 + "size" : "29x29",
  23 + "idiom" : "iphone",
  24 + "filename" : "Icon-App-29x29@2x.png",
  25 + "scale" : "2x"
  26 + },
  27 + {
  28 + "size" : "29x29",
  29 + "idiom" : "iphone",
  30 + "filename" : "Icon-App-29x29@3x.png",
  31 + "scale" : "3x"
  32 + },
  33 + {
  34 + "size" : "40x40",
  35 + "idiom" : "iphone",
  36 + "filename" : "Icon-App-40x40@2x.png",
  37 + "scale" : "2x"
  38 + },
  39 + {
  40 + "size" : "40x40",
  41 + "idiom" : "iphone",
  42 + "filename" : "Icon-App-40x40@3x.png",
  43 + "scale" : "3x"
  44 + },
  45 + {
  46 + "size" : "60x60",
  47 + "idiom" : "iphone",
  48 + "filename" : "Icon-App-60x60@2x.png",
  49 + "scale" : "2x"
  50 + },
  51 + {
  52 + "size" : "60x60",
  53 + "idiom" : "iphone",
  54 + "filename" : "Icon-App-60x60@3x.png",
  55 + "scale" : "3x"
  56 + },
  57 + {
  58 + "size" : "20x20",
  59 + "idiom" : "ipad",
  60 + "filename" : "Icon-App-20x20@1x.png",
  61 + "scale" : "1x"
  62 + },
  63 + {
  64 + "size" : "20x20",
  65 + "idiom" : "ipad",
  66 + "filename" : "Icon-App-20x20@2x.png",
  67 + "scale" : "2x"
  68 + },
  69 + {
  70 + "size" : "29x29",
  71 + "idiom" : "ipad",
  72 + "filename" : "Icon-App-29x29@1x.png",
  73 + "scale" : "1x"
  74 + },
  75 + {
  76 + "size" : "29x29",
  77 + "idiom" : "ipad",
  78 + "filename" : "Icon-App-29x29@2x.png",
  79 + "scale" : "2x"
  80 + },
  81 + {
  82 + "size" : "40x40",
  83 + "idiom" : "ipad",
  84 + "filename" : "Icon-App-40x40@1x.png",
  85 + "scale" : "1x"
  86 + },
  87 + {
  88 + "size" : "40x40",
  89 + "idiom" : "ipad",
  90 + "filename" : "Icon-App-40x40@2x.png",
  91 + "scale" : "2x"
  92 + },
  93 + {
  94 + "size" : "76x76",
  95 + "idiom" : "ipad",
  96 + "filename" : "Icon-App-76x76@1x.png",
  97 + "scale" : "1x"
  98 + },
  99 + {
  100 + "size" : "76x76",
  101 + "idiom" : "ipad",
  102 + "filename" : "Icon-App-76x76@2x.png",
  103 + "scale" : "2x"
  104 + },
  105 + {
  106 + "size" : "83.5x83.5",
  107 + "idiom" : "ipad",
  108 + "filename" : "Icon-App-83.5x83.5@2x.png",
  109 + "scale" : "2x"
  110 + },
  111 + {
  112 + "size" : "1024x1024",
  113 + "idiom" : "ios-marketing",
  114 + "filename" : "Icon-App-1024x1024@1x.png",
  115 + "scale" : "1x"
  116 + }
  117 + ],
  118 + "info" : {
  119 + "version" : 1,
  120 + "author" : "xcode"
  121 + }
  122 +}
... ...
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png 0 → 100644

10.7 KB

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png 0 → 100644

295 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png 0 → 100644

406 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png 0 → 100644

450 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png 0 → 100644

282 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png 0 → 100644

462 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png 0 → 100644

704 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png 0 → 100644

406 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png 0 → 100644

586 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png 0 → 100644

862 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png 0 → 100644

862 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png 0 → 100644

1.63 KB

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png 0 → 100644

762 Bytes

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png 0 → 100644

1.2 KB

ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png 0 → 100644

1.38 KB

ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json 0 → 100644
  1 +++ a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  1 +{
  2 + "images" : [
  3 + {
  4 + "idiom" : "universal",
  5 + "filename" : "LaunchImage.png",
  6 + "scale" : "1x"
  7 + },
  8 + {
  9 + "idiom" : "universal",
  10 + "filename" : "LaunchImage@2x.png",
  11 + "scale" : "2x"
  12 + },
  13 + {
  14 + "idiom" : "universal",
  15 + "filename" : "LaunchImage@3x.png",
  16 + "scale" : "3x"
  17 + }
  18 + ],
  19 + "info" : {
  20 + "version" : 1,
  21 + "author" : "xcode"
  22 + }
  23 +}
... ...
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png 0 → 100644

68 Bytes

ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png 0 → 100644

68 Bytes

ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png 0 → 100644

68 Bytes

ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md 0 → 100644
  1 +++ a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  1 +# Launch Screen Assets
  2 +
  3 +You can customize the launch screen with your own desired assets by replacing the image files in this directory.
  4 +
  5 +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
0 6 \ No newline at end of file
... ...
ios/Runner/Base.lproj/LaunchScreen.storyboard 0 → 100644
  1 +++ a/ios/Runner/Base.lproj/LaunchScreen.storyboard
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
  3 + <dependencies>
  4 + <deployment identifier="iOS"/>
  5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
  6 + </dependencies>
  7 + <scenes>
  8 + <!--View Controller-->
  9 + <scene sceneID="EHf-IW-A2E">
  10 + <objects>
  11 + <viewController id="01J-lp-oVM" sceneMemberID="viewController">
  12 + <layoutGuides>
  13 + <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
  14 + <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
  15 + </layoutGuides>
  16 + <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
  17 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  18 + <subviews>
  19 + <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
  20 + </imageView>
  21 + </subviews>
  22 + <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
  23 + <constraints>
  24 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
  25 + <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
  26 + </constraints>
  27 + </view>
  28 + </viewController>
  29 + <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
  30 + </objects>
  31 + <point key="canvasLocation" x="53" y="375"/>
  32 + </scene>
  33 + </scenes>
  34 + <resources>
  35 + <image name="LaunchImage" width="168" height="185"/>
  36 + </resources>
  37 +</document>
... ...
ios/Runner/Base.lproj/Main.storyboard 0 → 100644
  1 +++ a/ios/Runner/Base.lproj/Main.storyboard
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
  3 + <dependencies>
  4 + <deployment identifier="iOS"/>
  5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
  6 + </dependencies>
  7 + <scenes>
  8 + <!--Flutter View Controller-->
  9 + <scene sceneID="tne-QT-ifu">
  10 + <objects>
  11 + <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
  12 + <layoutGuides>
  13 + <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
  14 + <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
  15 + </layoutGuides>
  16 + <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
  17 + <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
  18 + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
  19 + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  20 + </view>
  21 + </viewController>
  22 + <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
  23 + </objects>
  24 + </scene>
  25 + </scenes>
  26 +</document>
... ...
ios/Runner/Info.plist 0 → 100644
  1 +++ a/ios/Runner/Info.plist
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3 +<plist version="1.0">
  4 +<dict>
  5 + <key>CFBundleDevelopmentRegion</key>
  6 + <string>$(DEVELOPMENT_LANGUAGE)</string>
  7 + <key>CFBundleDisplayName</key>
  8 + <string>Wow English</string>
  9 + <key>CFBundleExecutable</key>
  10 + <string>$(EXECUTABLE_NAME)</string>
  11 + <key>CFBundleIdentifier</key>
  12 + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
  13 + <key>CFBundleInfoDictionaryVersion</key>
  14 + <string>6.0</string>
  15 + <key>CFBundleName</key>
  16 + <string>wow_english</string>
  17 + <key>CFBundlePackageType</key>
  18 + <string>APPL</string>
  19 + <key>CFBundleShortVersionString</key>
  20 + <string>$(FLUTTER_BUILD_NAME)</string>
  21 + <key>CFBundleSignature</key>
  22 + <string>????</string>
  23 + <key>CFBundleVersion</key>
  24 + <string>$(FLUTTER_BUILD_NUMBER)</string>
  25 + <key>LSRequiresIPhoneOS</key>
  26 + <true/>
  27 + <key>UILaunchStoryboardName</key>
  28 + <string>LaunchScreen</string>
  29 + <key>UIMainStoryboardFile</key>
  30 + <string>Main</string>
  31 + <key>UISupportedInterfaceOrientations</key>
  32 + <array>
  33 + <string>UIInterfaceOrientationPortrait</string>
  34 + <string>UIInterfaceOrientationLandscapeLeft</string>
  35 + <string>UIInterfaceOrientationLandscapeRight</string>
  36 + </array>
  37 + <key>UISupportedInterfaceOrientations~ipad</key>
  38 + <array>
  39 + <string>UIInterfaceOrientationPortrait</string>
  40 + <string>UIInterfaceOrientationPortraitUpsideDown</string>
  41 + <string>UIInterfaceOrientationLandscapeLeft</string>
  42 + <string>UIInterfaceOrientationLandscapeRight</string>
  43 + </array>
  44 + <key>UIViewControllerBasedStatusBarAppearance</key>
  45 + <false/>
  46 + <key>CADisableMinimumFrameDurationOnPhone</key>
  47 + <true/>
  48 + <key>UIApplicationSupportsIndirectInputEvents</key>
  49 + <true/>
  50 +</dict>
  51 +</plist>
... ...
ios/Runner/Runner-Bridging-Header.h 0 → 100644
  1 +++ a/ios/Runner/Runner-Bridging-Header.h
  1 +#import "GeneratedPluginRegistrant.h"
... ...
ios/RunnerTests/RunnerTests.swift 0 → 100644
  1 +++ a/ios/RunnerTests/RunnerTests.swift
  1 +import Flutter
  2 +import UIKit
  3 +import XCTest
  4 +
  5 +class RunnerTests: XCTestCase {
  6 +
  7 + func testExample() {
  8 + // If you add code to the Runner application, consider adding tests here.
  9 + // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
  10 + }
  11 +
  12 +}
... ...
lib/app/app.dart 0 → 100644
  1 +++ a/lib/app/app.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:flutter_bloc/flutter_bloc.dart';
  3 +import 'package:flutter_easyloading/flutter_easyloading.dart';
  4 +import 'package:flutter_screenutil/flutter_screenutil.dart';
  5 +import 'package:wow_english/app/transition_page.dart';
  6 +import 'package:wow_english/login/login_page.dart';
  7 +import 'package:wow_english/route/route.dart';
  8 +import 'package:wow_english/tab/blocs/tab_bloc.dart';
  9 +
  10 +class App extends StatelessWidget {
  11 + const App({super.key});
  12 +
  13 + @override
  14 + Widget build(BuildContext context) {
  15 + return ScreenUtilInit(
  16 + designSize: const Size(375, 812),
  17 + builder: (_,__) => MultiBlocProvider(
  18 + providers: [
  19 + BlocProvider<TabBloc>(create: (_)=> TabBloc())
  20 + ],
  21 + child: MaterialApp(
  22 + title: 'Wow English',
  23 + theme: ThemeData(
  24 + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
  25 + useMaterial3: true,
  26 + ),
  27 + builder: EasyLoading.init(),
  28 + initialRoute: AppRouteName.splash,
  29 + navigatorKey: AppRouter.navigatorKey,
  30 + onGenerateRoute: AppRouter.generateRoute,
  31 + )),
  32 + );
  33 + }
  34 +}
... ...
lib/app/transition_page.dart 0 → 100644
  1 +++ a/lib/app/transition_page.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:wow_english/route/route.dart';
  3 +import 'package:wow_english/widgets/we_app_bar.dart';
  4 +
  5 +class TransitionPage extends StatelessWidget {
  6 + const TransitionPage({super.key});
  7 +
  8 + @override
  9 + Widget build(BuildContext context) {
  10 + return const TransitionView();
  11 + }
  12 +}
  13 +
  14 +class TransitionView extends StatefulWidget {
  15 + const TransitionView({super.key});
  16 +
  17 + @override
  18 + State<StatefulWidget> createState() {
  19 + return _TransitionViewState();
  20 + }
  21 +}
  22 +
  23 +class _TransitionViewState extends State<TransitionView> {
  24 + @override
  25 + Widget build(BuildContext context) {
  26 + return Scaffold(
  27 + appBar: WEAppBar(
  28 + titleText: '首页',
  29 + backgroundColor: Theme.of(context).colorScheme.inversePrimary
  30 + ),
  31 + body: Center(
  32 + child: GestureDetector(
  33 + onTap: (){
  34 + Navigator.of(context).pushNamed(AppRouteName.login,arguments: {'title':'登陆'});
  35 + },
  36 + child: const Text('登陆'),
  37 + ),
  38 + ),
  39 + );
  40 + }
  41 +}
0 42 \ No newline at end of file
... ...
lib/login/blocs/login_bloc.dart 0 → 100644
  1 +++ a/lib/login/blocs/login_bloc.dart
  1 +import 'package:flutter/foundation.dart';
  2 +import 'package:flutter_bloc/flutter_bloc.dart';
  3 +import 'package:flutter_easyloading/flutter_easyloading.dart';
  4 +import 'package:wow_english/network/api.dart';
  5 +import 'package:wow_english/network/network_manager.dart';
  6 +
  7 +part 'login_event.dart';
  8 +part 'login_state.dart';
  9 +
  10 +class LoginBloc extends Bloc<LoginEvent, LoginState> {
  11 +
  12 + bool _isLogin = false;
  13 +
  14 + bool get isLogin => _isLogin;
  15 +
  16 + LoginBloc() : super(LoginInitial()) {
  17 + on<RequestLoginEvent>(_requestLoginApi);
  18 + }
  19 +
  20 +
  21 + void _requestLoginApi(RequestLoginEvent event, Emitter<LoginState> emitter) async {
  22 + EasyLoading.show(status: 'loading');
  23 + await DioUtil().requestData(
  24 + Api.testApi,
  25 + successCallBack: (dynamic data){
  26 + EasyLoading.dismiss();
  27 + if (kDebugMode) {
  28 + print(data);
  29 + }
  30 + _isLogin = true;
  31 + emitter(LoginEventChangeState());
  32 + },
  33 + errorCallBack: (dynamic error){
  34 + EasyLoading.dismiss();
  35 + if (kDebugMode) {
  36 + print(error);
  37 + }
  38 + _isLogin = false;
  39 + emitter(LoginEventChangeState());
  40 + });
  41 + }
  42 +}
... ...
lib/login/blocs/login_event.dart 0 → 100644
  1 +++ a/lib/login/blocs/login_event.dart
  1 +part of 'login_bloc.dart';
  2 +
  3 +@immutable
  4 +abstract class LoginEvent {}
  5 +
  6 +class RequestLoginEvent extends LoginEvent {}
... ...
lib/login/blocs/login_state.dart 0 → 100644
  1 +++ a/lib/login/blocs/login_state.dart
  1 +part of 'login_bloc.dart';
  2 +
  3 +@immutable
  4 +abstract class LoginState {}
  5 +
  6 +class LoginInitial extends LoginState {}
  7 +
  8 +class LoginEventChangeState extends LoginState {}
... ...
lib/login/login_page.dart 0 → 100644
  1 +++ a/lib/login/login_page.dart
  1 +import 'package:flutter/foundation.dart';
  2 +import 'package:flutter/material.dart';
  3 +import 'package:flutter_bloc/flutter_bloc.dart';
  4 +import 'package:wow_english/login/blocs/login_bloc.dart';
  5 +import 'package:wow_english/modes/test_model.dart';
  6 +import 'package:wow_english/route/route.dart';
  7 +import 'package:wow_english/widgets/we_app_bar.dart';
  8 +
  9 +class LoginPage extends StatelessWidget {
  10 + const LoginPage({super.key, this.title});
  11 +
  12 + final String? title;
  13 +
  14 + @override
  15 + Widget build(BuildContext context) {
  16 + // TODO: implement build
  17 + return BlocProvider(
  18 + create: (context) => LoginBloc(),
  19 + child: _buildLoginViewWidget(),
  20 + );
  21 + }
  22 +
  23 + Widget _buildLoginViewWidget() => BlocBuilder<LoginBloc,LoginState> (
  24 + builder: (context, state) {
  25 + final bloc = BlocProvider.of<LoginBloc>(context);
  26 + return Scaffold(
  27 + appBar: WEAppBar(
  28 + backgroundColor: Theme.of(context).colorScheme.inversePrimary,
  29 + titleText: title??'',
  30 + ),
  31 + body: Center(
  32 + child: Column(
  33 + mainAxisAlignment: MainAxisAlignment.spaceAround,
  34 + children: [
  35 + GestureDetector(
  36 + onTap: () {
  37 + Navigator.of(context).pushNamedAndRemoveUntil(AppRouteName.tab, (route) => false);
  38 + },
  39 + child: const Text(
  40 + '进入首页'
  41 + ),
  42 + ),
  43 + Text(
  44 + bloc.isLogin?'登陆成功':'还未登陆'
  45 + ),
  46 + GestureDetector(
  47 + onTap: () {
  48 + TestModel testModel = TestModel(name: 'lcy',age: 31,sex: '男');
  49 + Map<String,dynamic> jsonMap = testModel.toJson();
  50 + if (kDebugMode) {
  51 + print(jsonMap);
  52 + }
  53 + TestModel testModel2 = TestModel.fromJson(jsonMap);
  54 + if (kDebugMode) {
  55 + print(testModel2.name);
  56 + }
  57 + },
  58 + child: const Text(
  59 + '数据转换'
  60 + ),
  61 + ),
  62 + GestureDetector(
  63 + onTap: (){
  64 + bloc.add(RequestLoginEvent());
  65 + },
  66 + child: const Text(
  67 + '发起网络请求'
  68 + ),
  69 + )
  70 + ],
  71 + ),
  72 + ),
  73 + );
  74 + },
  75 + );
  76 +}
... ...
lib/main.dart 0 → 100644
  1 +++ a/lib/main.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:wow_english/app/app.dart';
  3 +
  4 +void main() {
  5 + runApp(const App());
  6 +}
... ...
lib/modes/test_model.dart 0 → 100644
  1 +++ a/lib/modes/test_model.dart
  1 +import 'package:json_annotation/json_annotation.dart';
  2 +
  3 +part 'test_model.g.dart';
  4 +
  5 +@JsonSerializable()
  6 +class TestModel {
  7 + @JsonKey(name: 'test_name')
  8 + String? name;
  9 + @JsonKey(defaultValue: '男')
  10 + String? sex;
  11 + int? age;
  12 +
  13 + TestModel({this.name,this.sex,this.age});
  14 +
  15 + factory TestModel.fromJson(Map<String, dynamic> json) => _$TestModelFromJson(json);
  16 +
  17 + Map<String, dynamic> toJson() => _$TestModelToJson(this);
  18 +}
0 19 \ No newline at end of file
... ...
lib/modes/test_model.g.dart 0 → 100644
  1 +++ a/lib/modes/test_model.g.dart
  1 +// GENERATED CODE - DO NOT MODIFY BY HAND
  2 +
  3 +part of 'test_model.dart';
  4 +
  5 +// **************************************************************************
  6 +// JsonSerializableGenerator
  7 +// **************************************************************************
  8 +
  9 +TestModel _$TestModelFromJson(Map<String, dynamic> json) => TestModel(
  10 + name: json['test_name'] as String?,
  11 + sex: json['sex'] as String? ?? '男',
  12 + age: json['age'] as int?,
  13 + );
  14 +
  15 +Map<String, dynamic> _$TestModelToJson(TestModel instance) => <String, dynamic>{
  16 + 'test_name': instance.name,
  17 + 'sex': instance.sex,
  18 + 'age': instance.age,
  19 + };
... ...
lib/network/api.dart 0 → 100644
  1 +++ a/lib/network/api.dart
  1 +class Api {
  2 + static const String testApi = 'https://dart.dev';
  3 +}
0 4 \ No newline at end of file
... ...
lib/network/network_manager.dart 0 → 100644
  1 +++ a/lib/network/network_manager.dart
  1 +import 'dart:io';
  2 +
  3 +import 'package:dio/dio.dart';
  4 +
  5 +enum HttpMethod {
  6 + get,
  7 + put,
  8 + post,
  9 + head,
  10 + patch,
  11 + delete,
  12 +}
  13 +
  14 +class DioUtil {
  15 + static final Dio _dio = getDefDio();
  16 +
  17 + static Dio getDefDio() {
  18 + Dio dio = Dio();
  19 + dio.options = getDefOptions();
  20 + return dio;
  21 + }
  22 +
  23 + static BaseOptions getDefOptions() {
  24 + final BaseOptions options = BaseOptions();
  25 + options.baseUrl = '';
  26 + options.connectTimeout = const Duration(milliseconds: 1000);
  27 + options.receiveTimeout = const Duration(milliseconds: 1000);
  28 + return options;
  29 + }
  30 +
  31 + Future<void> requestData<T>(
  32 + String path, {
  33 + data,
  34 + HttpMethod method = HttpMethod.get,
  35 + Map<String, dynamic>? queryParameters,
  36 + ProgressCallback? onSendProgress,
  37 + ProgressCallback? onReceiveProgress,
  38 + required Function successCallBack,
  39 + required Function errorCallBack,
  40 + }) async{
  41 + try {
  42 + Response<dynamic> response;
  43 + response = await _dio.request(
  44 + path,
  45 + data: data??{},
  46 + queryParameters: queryParameters,
  47 + options: Options(method: method.name),
  48 + onSendProgress: onSendProgress,
  49 + onReceiveProgress: onReceiveProgress);
  50 + if (response.statusCode == HttpStatus.ok ||
  51 + response.statusCode == HttpStatus.created) {
  52 + successCallBack(response.data);
  53 + } else {
  54 + errorCallBack('请求失败');
  55 + }
  56 + } on Error {
  57 + rethrow;
  58 + }
  59 + }
  60 +}
0 61 \ No newline at end of file
... ...
lib/pages/page1.dart 0 → 100644
  1 +++ a/lib/pages/page1.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:wow_english/widgets/we_app_bar.dart';
  3 +
  4 +class Page1 extends StatelessWidget {
  5 + const Page1({super.key});
  6 +
  7 + @override
  8 + Widget build(BuildContext context) {
  9 + return const Scaffold(
  10 + appBar: WEAppBar(
  11 + titleText: '页面1',
  12 + ),
  13 + body:Center(
  14 + child: Text('页面1'),
  15 + ),
  16 + );
  17 + }
  18 +}
0 19 \ No newline at end of file
... ...
lib/pages/page2.dart 0 → 100644
  1 +++ a/lib/pages/page2.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:wow_english/widgets/we_app_bar.dart';
  3 +
  4 +class Page2 extends StatelessWidget {
  5 + const Page2({super.key});
  6 +
  7 + @override
  8 + Widget build(BuildContext context) {
  9 + return const Scaffold(
  10 + appBar: WEAppBar(
  11 + titleText: '页面2',
  12 + ),
  13 + body:Center(
  14 + child: Text('页面2'),
  15 + ),
  16 + );
  17 + }
  18 +}
0 19 \ No newline at end of file
... ...
lib/route/route.dart 0 → 100644
  1 +++ a/lib/route/route.dart
  1 +import 'package:flutter/cupertino.dart';
  2 +import 'package:flutter/material.dart';
  3 +import 'package:wow_english/app/transition_page.dart';
  4 +import 'package:wow_english/login/login_page.dart';
  5 +import 'package:wow_english/tab/tab_page.dart';
  6 +
  7 +
  8 +class AppRouteName {
  9 + static const String splash = 'splash';
  10 + static const String login = 'login';
  11 + static const String tab = '/';
  12 +}
  13 +
  14 +class AppRouter {
  15 + static final navigatorKey = GlobalKey<NavigatorState>();
  16 + // App 根节点Context
  17 + static BuildContext get context => navigatorKey.currentContext!;
  18 +
  19 + static Route<dynamic> generateRoute(RouteSettings settings) {
  20 + switch (settings.name) {
  21 + case AppRouteName.splash:
  22 + return PageRouteBuilder(
  23 + opaque: false,
  24 + pageBuilder: (_,__,___) => const TransitionPage(),
  25 + transitionDuration: Duration.zero,
  26 + transitionsBuilder: (_, __, ___, child) => child);
  27 + case AppRouteName.login:
  28 + final title = (settings.arguments as Map)['title'] as String;
  29 + return CupertinoPageRoute(builder: (_) => LoginPage(title: title));
  30 + case AppRouteName.tab:
  31 + return PageRouteBuilder(
  32 + opaque: false,
  33 + settings: const RouteSettings(name: AppRouteName.tab),
  34 + transitionDuration: Duration.zero,
  35 + pageBuilder: (_,__,___) => const TabPage(),
  36 + transitionsBuilder: (_, __, ___, child) => child);
  37 + default:
  38 + return CupertinoPageRoute(
  39 + builder: (_) => Scaffold(
  40 + body: Center(
  41 + child: Text('No route defined for ${settings.name}'))));
  42 + }
  43 + }
  44 +}
0 45 \ No newline at end of file
... ...
lib/tab/blocs/tab_bloc.dart 0 → 100644
  1 +++ a/lib/tab/blocs/tab_bloc.dart
  1 +import 'dart:async';
  2 +
  3 +import 'package:bloc/bloc.dart';
  4 +import 'package:meta/meta.dart';
  5 +
  6 +part 'tab_event.dart';
  7 +part 'tab_state.dart';
  8 +
  9 +class TabBloc extends Bloc<TabEvent, TabState> {
  10 + TabBloc() : super(const TabState()) {
  11 + on<UpdateTabIndexEvent>(_onUpdateTabIndex);
  12 + }
  13 +
  14 + void _onUpdateTabIndex(
  15 + UpdateTabIndexEvent event, Emitter<TabState> emitter) async {
  16 + emitter(state.copyWith(index: event.index));
  17 + }
  18 +}
... ...
lib/tab/blocs/tab_event.dart 0 → 100644
  1 +++ a/lib/tab/blocs/tab_event.dart
  1 +part of 'tab_bloc.dart';
  2 +
  3 +@immutable
  4 +abstract class TabEvent {
  5 + const TabEvent();
  6 +}
  7 +
  8 +class UpdateTabIndexEvent extends TabEvent {
  9 + final int index;
  10 + const UpdateTabIndexEvent(this.index);
  11 +}
... ...
lib/tab/blocs/tab_state.dart 0 → 100644
  1 +++ a/lib/tab/blocs/tab_state.dart
  1 +part of 'tab_bloc.dart';
  2 +
  3 +@immutable
  4 +class TabState {
  5 + final int index;
  6 + const TabState({this.index = 0});
  7 + TabState copyWith({int? index}) => TabState(index: index ?? this.index);
  8 +}
  9 +
... ...
lib/tab/tab_page.dart 0 → 100644
  1 +++ a/lib/tab/tab_page.dart
  1 +import 'package:flutter/material.dart';
  2 +import 'package:flutter_bloc/flutter_bloc.dart';
  3 +import 'package:wow_english/Pages/page1.dart';
  4 +import 'package:wow_english/Pages/page2.dart';
  5 +import 'package:wow_english/tab/blocs/tab_bloc.dart';
  6 +
  7 +class TabPage extends StatelessWidget {
  8 + const TabPage({super.key});
  9 +
  10 + final _pages =const <Widget>[
  11 + Page1(),
  12 + Page2()
  13 + ];
  14 +
  15 + final _tabIcons = const <Icon>[
  16 + Icon(Icons.ac_unit),
  17 + Icon(Icons.ac_unit_outlined)
  18 + ];
  19 +
  20 + final _tabTexts = const <String>[
  21 + '页面1',
  22 + '页面2'
  23 + ];
  24 +
  25 + @override
  26 + Widget build(BuildContext context) {
  27 + return Scaffold(
  28 + body: _buildIndexedStack(),
  29 + bottomNavigationBar: _buildBottomNavBars(),
  30 + );
  31 + }
  32 +
  33 + Widget _buildIndexedStack() => BlocBuilder<TabBloc,TabState>(
  34 + builder: (context, state) => IndexedStack(
  35 + index: state.index,
  36 + children: _pages,
  37 + )
  38 + );
  39 +
  40 + Widget _buildBottomNavBars() => BlocBuilder<TabBloc,TabState>(
  41 + builder: (context, state) => Container(
  42 + decoration: BoxDecoration(
  43 + boxShadow: <BoxShadow>[
  44 + BoxShadow(
  45 + color: Theme.of(context).dividerColor,
  46 + blurRadius: .1
  47 + )
  48 + ]
  49 + ),
  50 + child: BottomNavigationBar(
  51 + currentIndex: state.index,
  52 + items: _buildBottomNavBarItems(context),
  53 + onTap: (value) => context.read<TabBloc>().add(UpdateTabIndexEvent(value)),
  54 + ),
  55 + )
  56 + );
  57 +
  58 + List<BottomNavigationBarItem> _buildBottomNavBarItems(BuildContext context) => _tabIcons.map((e) {
  59 + final index = _tabIcons.indexOf(e);
  60 + return BottomNavigationBarItem(
  61 + label: _tabTexts[index],
  62 + activeIcon: _tabIcons[index],
  63 + icon: _tabIcons[index]
  64 + );}).toList();
  65 +}
... ...
lib/widgets/we_app_bar.dart 0 → 100644
  1 +++ a/lib/widgets/we_app_bar.dart
  1 +import 'package:flutter/material.dart';
  2 +
  3 +class WEAppBar extends StatelessWidget implements PreferredSizeWidget {
  4 + final String? titleText;
  5 + final bool? centerTitle;
  6 + final VoidCallback? onBack;
  7 + final Color? backgroundColor;
  8 + final PreferredSizeWidget? bottom;
  9 + const WEAppBar({
  10 + this.titleText,
  11 + this.centerTitle = true,
  12 + this.onBack,
  13 + this.backgroundColor,
  14 + this.bottom,
  15 + super.key});
  16 +
  17 + @override
  18 + Widget build(BuildContext context) {
  19 + return AppBar(
  20 + centerTitle: centerTitle,
  21 + title: Text(titleText??''),
  22 + backgroundColor: backgroundColor,
  23 + );
  24 + }
  25 +
  26 + @override
  27 + // TODO: implement preferredSize
  28 + Size get preferredSize => Size.fromHeight(
  29 + kToolbarHeight + (bottom == null ? 0.0 : bottom!.preferredSize.height));
  30 +}
0 31 \ No newline at end of file
... ...
pubspec.yaml 0 → 100644
  1 +++ a/pubspec.yaml
  1 +name: wow_english
  2 +description: A new Flutter project.
  3 +# The following line prevents the package from being accidentally published to
  4 +# pub.dev using `flutter pub publish`. This is preferred for private packages.
  5 +publish_to: 'none' # Remove this line if you wish to publish to pub.dev
  6 +
  7 +# The following defines the version and build number for your application.
  8 +# A version number is three numbers separated by dots, like 1.2.43
  9 +# followed by an optional build number separated by a +.
  10 +# Both the version and the builder number may be overridden in flutter
  11 +# build by specifying --build-name and --build-number, respectively.
  12 +# In Android, build-name is used as versionName while build-number used as versionCode.
  13 +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
  14 +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
  15 +# Read more about iOS versioning at
  16 +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
  17 +# In Windows, build-name is used as the major, minor, and patch parts
  18 +# of the product and file versions while build-number is used as the build suffix.
  19 +version: 1.0.0+1
  20 +
  21 +environment:
  22 + sdk: '>=3.0.0 <4.0.0'
  23 +
  24 +# Dependencies specify other packages that your package needs in order to work.
  25 +# To automatically upgrade your package dependencies to the latest versions
  26 +# consider running `flutter pub upgrade --major-versions`. Alternatively,
  27 +# dependencies can be manually updated by changing the version numbers below to
  28 +# the latest version available on pub.dev. To see which dependencies have newer
  29 +# versions available, run `flutter pub outdated`.
  30 +dependencies:
  31 + flutter:
  32 + sdk: flutter
  33 +
  34 +
  35 + # The following adds the Cupertino Icons font to your application.
  36 + # Use with the CupertinoIcons class for iOS style icons.
  37 + cupertino_icons: ^1.0.2
  38 + #网络请求 https://pub.dev/packages/dio
  39 + dio: ^5.1.2
  40 + #谷歌字体 https://pub.dev/packages/google_fonts
  41 + google_fonts: ^4.0.4
  42 + #状态管理 https://pub.dev/packages/flutter_bloc
  43 + flutter_bloc: ^8.1.2
  44 + #弹窗 https://pub.dev/packages/fluttertoast
  45 + fluttertoast: ^8.2.2
  46 + #Url跳转 https://pub.dev/packages/url_launcher
  47 + url_launcher: ^6.1.11
  48 + #网页加载 https://pub.dev/packages/webview_flutter
  49 + webview_flutter: ^4.2.0
  50 + #下拉刷新 https://pub.dev/packages/pull_to_refresh
  51 + pull_to_refresh: ^2.0.0
  52 + # 数据持久化 https://pub.dev/packages/shared_preferences
  53 + shared_preferences: ^2.1.1
  54 + #字体/尺寸适配 https://pub.dev/packages/flutter_screenutil
  55 + flutter_screenutil: ^5.8.1
  56 + # 显示网络等待插件 https://pub.flutter-io.cn/packages/flutter_easyloading
  57 + flutter_easyloading: ^3.0.5
  58 + # 增强组件相等性判断 https://pub.flutter-io.cn/packages/equatable
  59 + equatable: ^2.0.5
  60 + # 轮播图 https://pub.flutter-io.cn/packages/card_swiper
  61 + card_swiper: ^2.0.4
  62 + # 图片操作(解码,图片尺寸等) https://pub.flutter-io.cn/packages/image
  63 + image: ^4.0.17
  64 + # 拍照,从相册中选择 https://pub.flutter-io.cn/packages/image_picker
  65 + image_picker: ^0.8.7+5
  66 + # 支付宝支付SDK https://pub.flutter-io.cn/packages/tobias
  67 +# tobias: ^3.1.0
  68 + # 微信SDK相关 https://pub.flutter-io.cn/packages/fluwx
  69 +# fluwx: ^4.2.4+1
  70 + # json数据解析 https://pub.flutter-io.cn/packages/json_annotation
  71 + json_annotation: ^4.8.1
  72 + # double丢失精度问题 https://pub.dev/packages/decimal
  73 + decimal: ^2.3.2
  74 + # 网络图片缓存 https://pub.flutter-io.cn/packages/cached_network_image
  75 + cached_network_image: ^3.2.3
  76 + # 常用工具类(时间轴,倒计时等) https://pub.flutter-io.cn/packages/common_utils
  77 + common_utils: ^2.1.0
  78 + # 获取设备信息 https://pub.flutter-io.cn/packages/device_info_plus
  79 + device_info_plus: ^9.0.1
  80 + # 用户权限申请 https://pub.dev/packages/permission_handler
  81 + permission_handler: ^10.2.0
  82 +
  83 +dev_dependencies:
  84 + build_runner: ^2.4.4
  85 + json_serializable: ^6.7.0
  86 + flutter_test:
  87 + sdk: flutter
  88 +
  89 + # The "flutter_lints" package below contains a set of recommended lints to
  90 + # encourage good coding practices. The lint set provided by the package is
  91 + # activated in the `analysis_options.yaml` file located at the root of your
  92 + # package. See that file for information about deactivating specific lint
  93 + # rules and activating additional ones.
  94 + flutter_lints: ^2.0.0
  95 +
  96 +# For information on the generic Dart part of this file, see the
  97 +# following page: https://dart.dev/tools/pub/pubspec
  98 +
  99 +# The following section is specific to Flutter packages.
  100 +flutter:
  101 +
  102 + # The following line ensures that the Material Icons font is
  103 + # included with your application, so that you can use the icons in
  104 + # the material Icons class.
  105 + uses-material-design: true
  106 +
  107 + # To add assets to your application, add an assets section, like this:
  108 + # assets:
  109 + # - images/a_dot_burr.jpeg
  110 + # - images/a_dot_ham.jpeg
  111 +
  112 + # An image asset can refer to one or more resolution-specific "variants", see
  113 + # https://flutter.dev/assets-and-images/#resolution-aware
  114 +
  115 + # For details regarding adding assets from package dependencies, see
  116 + # https://flutter.dev/assets-and-images/#from-packages
  117 +
  118 + # To add custom fonts to your application, add a fonts section here,
  119 + # in this "flutter" section. Each entry in this list should have a
  120 + # "family" key with the font family name, and a "fonts" key with a
  121 + # list giving the asset and other descriptors for the font. For
  122 + # example:
  123 + # fonts:
  124 + # - family: Schyler
  125 + # fonts:
  126 + # - asset: fonts/Schyler-Regular.ttf
  127 + # - asset: fonts/Schyler-Italic.ttf
  128 + # style: italic
  129 + # - family: Trajan Pro
  130 + # fonts:
  131 + # - asset: fonts/TrajanPro.ttf
  132 + # - asset: fonts/TrajanPro_Bold.ttf
  133 + # weight: 700
  134 + #
  135 + # For details regarding fonts from package dependencies,
  136 + # see https://flutter.dev/custom-fonts/#from-packages
... ...
test/widget_test.dart 0 → 100644
  1 +++ a/test/widget_test.dart
  1 +// This is a basic Flutter widget test.
  2 +//
  3 +// To perform an interaction with a widget in your test, use the WidgetTester
  4 +// utility in the flutter_test package. For example, you can send tap and scroll
  5 +// gestures. You can also use WidgetTester to find child widgets in the widget
  6 +// tree, read text, and verify that the values of widget properties are correct.
  7 +
  8 +import 'package:flutter/material.dart';
  9 +import 'package:flutter_test/flutter_test.dart';
  10 +import 'package:wow_english/app/app.dart';
  11 +
  12 +import 'package:wow_english/main.dart';
  13 +
  14 +void main() {
  15 + testWidgets('Counter increments smoke test', (WidgetTester tester) async {
  16 + // Build our app and trigger a frame.
  17 + await tester.pumpWidget(const App());
  18 +
  19 + // Verify that our counter starts at 0.
  20 + expect(find.text('0'), findsOneWidget);
  21 + expect(find.text('1'), findsNothing);
  22 +
  23 + // Tap the '+' icon and trigger a frame.
  24 + await tester.tap(find.byIcon(Icons.add));
  25 + await tester.pump();
  26 +
  27 + // Verify that our counter has incremented.
  28 + expect(find.text('0'), findsNothing);
  29 + expect(find.text('1'), findsOneWidget);
  30 + });
  31 +}
... ...