[
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.atom/\n.dart_tool/\n.idea\n.vscode/\n.packages\n.pub/\nbuild/\nios/.generated/\npackages\n.flutter-plugins\n"
  },
  {
    "path": ".metadata",
    "content": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrades etc.\n#\n# This file should be version controlled and should not be manually edited.\n\nversion:\n  revision: eef77ccaff6ca0a9884c7454938b7833746e95df\n  channel: dev\n"
  },
  {
    "path": "README.md",
    "content": "# zhihudaily_flutter\n\nA new Flutter zhihudaily project.\n\n## Getting Started\n\nFor help getting started with Flutter, view our online\n[documentation](https://flutter.io/).\n\nwaiting..\n"
  },
  {
    "path": "android/.gitignore",
    "content": "*.iml\n*.class\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\nGeneratedPluginRegistrant.java\n"
  },
  {
    "path": "android/app/build.gradle",
    "content": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertiesFile.exists()) {\n    localPropertiesFile.withReader('UTF-8') { reader ->\n        localProperties.load(reader)\n    }\n}\n\ndef flutterRoot = localProperties.getProperty('flutter.sdk')\nif (flutterRoot == null) {\n    throw new GradleException(\"Flutter SDK not found. Define location with flutter.sdk in the local.properties file.\")\n}\n\napply plugin: 'com.android.application'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\ndef keystorePropertiesFile = rootProject.file(\"key.properties\")\ndef keystoreProperties = new Properties()\nkeystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n\nandroid {\n    compileSdkVersion 27\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).\n        applicationId \"com.yourcompany.starter\"\n        minSdkVersion 16\n        targetSdkVersion 27\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n\n    signingConfigs {\n        release {\n            keyAlias keystoreProperties['keyAlias']\n            keyPassword keystoreProperties['keyPassword']\n            storeFile file(keystoreProperties['storeFile'])\n            storePassword keystoreProperties['storePassword']\n        }\n    }\n    buildTypes {\n        release {\n            signingConfig signingConfigs.release\n        }\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    testImplementation 'junit:junit:4.12'\n    androidTestImplementation 'com.android.support.test:runner:1.0.1'\n    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'\n}\n"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.yourcompany.starter\">\n\n    <!-- The INTERNET permission is required for development. Specifically,\n         flutter needs it to communicate with the running application\n         to allow setting breakpoints, to provide hot reload, etc.\n    -->\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n\n    <!-- io.flutter.app.FlutterApplication is an android.app.Application that\n         calls FlutterMain.startInitialization(this); in its onCreate method.\n         In most cases you can leave this as-is, but you if you want to provide\n         additional functionality it is fine to subclass or reimplement\n         FlutterApplication and put your custom class here. -->\n    <application\n        android:name=\"io.flutter.app.FlutterApplication\"\n        android:label=\"zhihudaily\"\n        android:icon=\"@mipmap/ic_launcher\">\n        <activity\n            android:name=\".MainActivity\"\n            android:launchMode=\"singleTop\"\n            android:theme=\"@style/LaunchTheme\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\">\n            <!-- This keeps the window background of the activity showing\n                 until Flutter renders its first frame. It can be removed if\n                 there is no splash screen (such as the default splash screen\n                 defined in @style/LaunchTheme). -->\n            <meta-data\n                android:name=\"io.flutter.app.android.SplashScreenUntilFirstFrame\"\n                android:value=\"true\" />\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n        <activity android:name=\".TestActivity\"/>\n    </application>\n</manifest>\n"
  },
  {
    "path": "android/app/src/main/java/com/yourcompany/starter/MainActivity.java",
    "content": "package com.yourcompany.starter;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.ContextWrapper;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.os.BatteryManager;\nimport android.os.Build;\nimport android.os.Bundle;\n\nimport junit.framework.Test;\n\nimport io.flutter.app.FlutterActivity;\nimport io.flutter.plugin.common.EventChannel;\nimport io.flutter.plugin.common.EventChannel.EventSink;\nimport io.flutter.plugin.common.EventChannel.StreamHandler;\nimport io.flutter.plugin.common.MethodCall;\nimport io.flutter.plugin.common.MethodChannel;\nimport io.flutter.plugin.common.MethodChannel.MethodCallHandler;\nimport io.flutter.plugin.common.MethodChannel.Result;\nimport io.flutter.plugins.GeneratedPluginRegistrant;\n\npublic class MainActivity extends FlutterActivity {\n    private static final String BATTERY_CHANNEL = \"samples.flutter.io/battery\";\n    private static final String CHARGING_CHANNEL = \"samples.flutter.io/charging\";\n    private static final String INTENT_CHANNEL = \"samples.flutter.io/intent\";\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        GeneratedPluginRegistrant.registerWith(this);\n        new EventChannel(getFlutterView(), CHARGING_CHANNEL).setStreamHandler(new StreamHandler() {\n            private BroadcastReceiver chargingStateChangeReceiver;\n\n            @Override\n            public void onListen(Object arguments, EventSink events) {\n                chargingStateChangeReceiver = createChargingStateChangeReceiver(events);\n                registerReceiver(chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\n            }\n\n            @Override\n            public void onCancel(Object arguments) {\n                unregisterReceiver(chargingStateChangeReceiver);\n                chargingStateChangeReceiver = null;\n            }\n        });\n\n        new MethodChannel(getFlutterView(), INTENT_CHANNEL).setMethodCallHandler(new MethodCallHandler() {\n            @Override\n            public void onMethodCall(MethodCall call, Result result) {\n                if (call.method.equals(\"gotoActivity\")) {\n                    Intent intent = new Intent(MainActivity.this, TestActivity.class);\n                    startActivity(intent);\n                } else {\n                    result.notImplemented();\n                }\n            }\n        });\n\n        new MethodChannel(getFlutterView(), BATTERY_CHANNEL).setMethodCallHandler(new MethodCallHandler() {\n            @Override\n            public void onMethodCall(MethodCall call, Result result) {\n                if (call.method.equals(\"getBatteryLevel\")) {\n                    int batteryLevel = getBatteryLevel();\n\n                    if (batteryLevel != -1) {\n                        result.success(batteryLevel);\n                    } else {\n                        result.error(\"UNAVAILABLE\", \"Battery level not available.\", null);\n                    }\n                } else {\n                    result.notImplemented();\n                }\n            }\n        });\n    }\n\n    private BroadcastReceiver createChargingStateChangeReceiver(final EventSink events) {\n        return new BroadcastReceiver() {\n            @Override\n            public void onReceive(Context context, Intent intent) {\n                int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);\n\n                if (status == BatteryManager.BATTERY_STATUS_UNKNOWN) {\n                    events.error(\"UNAVAILABLE\", \"Charging status unavailable\", null);\n                } else {\n                    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING\n                        || status == BatteryManager.BATTERY_STATUS_FULL;\n                    events.success(isCharging ? \"charging\" : \"discharging\");\n                }\n            }\n        };\n    }\n\n    private int getBatteryLevel() {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);\n            return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);\n        } else {\n            Intent intent = new ContextWrapper(getApplicationContext()).\n                registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));\n            return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) / intent.getIntExtra(\n                BatteryManager.EXTRA_SCALE, -1);\n        }\n    }\n}\n"
  },
  {
    "path": "android/app/src/main/java/com/yourcompany/starter/TestActivity.java",
    "content": "package com.yourcompany.starter;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\npublic class TestActivity extends Activity {\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.test_activity);\n    }\n}\n"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <!-- You can insert your own image assets here -->\n    <!-- <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/launch_image\" />\n    </item> -->\n</layer-list>\n"
  },
  {
    "path": "android/app/src/main/res/layout/test_activity.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"#FFFFFF\"\n    android:orientation=\"horizontal\">\n</LinearLayout>\n"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"LaunchTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <!-- Show a splash screen on the activity. Automatically removed when\n             Flutter draws its first frame -->\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "android/build.gradle",
    "content": "buildscript {\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:3.0.1'\n    }\n}\n\nallprojects {\n    repositories {\n        google()\n        jcenter()\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-4.1-all.zip\n"
  },
  {
    "path": "android/gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "android/gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "android/key.properties",
    "content": "storePassword=rice1985\nkeyPassword=rice1985\nkeyAlias=key\nstoreFile=/Users/lhw/key.jks\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "include ':app'\n\ndef flutterProjectRoot = rootProject.projectDir.parentFile.toPath()\n\ndef plugins = new Properties()\ndef pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')\nif (pluginsFile.exists()) {\n    pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }\n}\n\nplugins.each { name, path ->\n    def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()\n    include \":$name\"\n    project(\":$name\").projectDir = pluginDirectory\n}\n"
  },
  {
    "path": "flutter_01.log",
    "content": "Flutter crash report; please file at https://github.com/flutter/flutter/issues.\n\n## command\n\nflutter upgrade\n\n## exception\n\nArgumentError: Invalid argument(s): Cannot find executable for /Users/lhw/flutter/bin/cache/dart-sdk/bin/pub.\n\n```\n#0      _getExecutable (package:process/src/interface/local_process_manager.dart:113)\n#1      LocalProcessManager.start (package:process/src/interface/local_process_manager.dart:41)\n#2      runCommand (package:flutter_tools/src/base/process.dart:115)\n#3      runCommandAndStreamOutput (package:flutter_tools/src/base/process.dart:133)\n<asynchronous suspension>\n#4      pub (package:flutter_tools/src/dart/pub.dart:153)\n<asynchronous suspension>\n#5      pubGet (package:flutter_tools/src/dart/pub.dart:104)\n<asynchronous suspension>\n#6      UpgradeCommand.runCommand (package:flutter_tools/src/commands/upgrade.dart:75)\n<asynchronous suspension>\n#7      FlutterCommand.verifyThenRunCommand (package:flutter_tools/src/runner/flutter_command.dart:344)\n<asynchronous suspension>\n#8      FlutterCommand.run.<anonymous closure> (package:flutter_tools/src/runner/flutter_command.dart:279)\n<asynchronous suspension>\n#9      AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:142)\n<asynchronous suspension>\n#10     _rootRun (dart:async/zone.dart:1126)\n#11     _CustomZone.run (dart:async/zone.dart:1023)\n#12     runZoned (dart:async/zone.dart:1501)\n#13     AppContext.run (package:flutter_tools/src/base/context.dart:141)\n<asynchronous suspension>\n#14     FlutterCommand.run (package:flutter_tools/src/runner/flutter_command.dart:270)\n#15     CommandRunner.runCommand (package:args/command_runner.dart:194)\n<asynchronous suspension>\n#16     FlutterCommandRunner.runCommand.<anonymous closure> (package:flutter_tools/src/runner/flutter_command_runner.dart:309)\n<asynchronous suspension>\n#17     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:142)\n<asynchronous suspension>\n#18     _rootRun (dart:async/zone.dart:1126)\n#19     _CustomZone.run (dart:async/zone.dart:1023)\n#20     runZoned (dart:async/zone.dart:1501)\n#21     AppContext.run (package:flutter_tools/src/base/context.dart:141)\n<asynchronous suspension>\n#22     FlutterCommandRunner.runCommand (package:flutter_tools/src/runner/flutter_command_runner.dart:265)\n<asynchronous suspension>\n#23     CommandRunner.run.<anonymous closure> (package:args/command_runner.dart:109)\n#24     new Future.sync (dart:async/future.dart:222)\n#25     CommandRunner.run (package:args/command_runner.dart:109)\n#26     FlutterCommandRunner.run (package:flutter_tools/src/runner/flutter_command_runner.dart:174)\n#27     run.<anonymous closure> (package:flutter_tools/runner.dart:59)\n<asynchronous suspension>\n#28     AppContext.run.<anonymous closure> (package:flutter_tools/src/base/context.dart:142)\n<asynchronous suspension>\n#29     _rootRun (dart:async/zone.dart:1126)\n#30     _CustomZone.run (dart:async/zone.dart:1023)\n#31     runZoned (dart:async/zone.dart:1501)\n#32     AppContext.run (package:flutter_tools/src/base/context.dart:141)\n<asynchronous suspension>\n#33     runInContext (package:flutter_tools/src/context_runner.dart:43)\n<asynchronous suspension>\n#34     run (package:flutter_tools/runner.dart:50)\n#35     main (package:flutter_tools/executable.dart:49)\n<asynchronous suspension>\n#36     main (file:///Users/lhw/flutter/packages/flutter_tools/bin/flutter_tools.dart:8)\n#37     _startIsolate.<anonymous closure> (dart:isolate-patch/dart:isolate/isolate_patch.dart:277)\n#38     _RawReceivePortImpl._handleMessage (dart:isolate-patch/dart:isolate/isolate_patch.dart:165)\n```\n\n## flutter doctor\n\n```\n[✓] Flutter (Channel beta, v0.5.1, on Mac OS X 10.14.1 18B75, locale zh-Hans-CN)\n    • Flutter version 0.5.1 at /Users/lhw/flutter\n    • Framework revision c7ea3ca377 (7 months ago), 2018-11-29 19:41:26 -0800\n    • Engine revision 7375a0f414\n    • Dart version 2.0.0-dev.58.0.flutter-f981f09760\n\n[!] Android toolchain - develop for Android devices (Android SDK 28.0.3)\n    • Android SDK at /Users/lhw/android-sdks\n    • Android NDK at /Users/lhw/android-sdks/ndk-bundle\n    • Platform android-28, build-tools 28.0.3\n    • ANDROID_HOME = /Users/lhw/android-sdks\n    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java\n    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)\n    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses\n\n[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)\n    • Xcode at /Applications/Xcode.app/Contents/Developer\n    • Xcode 10.1, Build version 10B61\n    • ios-deploy 1.9.2\n    • CocoaPods version 1.5.3\n\n[✓] Android Studio (version 3.2)\n    • Android Studio at /Applications/Android Studio.app/Contents\n    ✗ Flutter plugin not installed; this adds Flutter specific functionality.\n    ✗ Dart plugin not installed; this adds Dart specific functionality.\n    • Java version OpenJDK Runtime Environment (build 1.8.0_152-release-1136-b06)\n\n[✓] IntelliJ IDEA Ultimate Edition (version 2018.1.1)\n    • IntelliJ at /Applications/IntelliJ IDEA.app\n    • Flutter plugin version 26.0.2\n    • Dart plugin version 181.4096.12\n\n[✓] Connected devices (1 available)\n    • MIX 2 • e4413f71 • android-arm64 • Android 8.0.0 (API 26)\n\n! Doctor found issues in 1 category.\n```\n"
  },
  {
    "path": "ios/.gitignore",
    "content": ".idea/\n.vagrant/\n.sconsign.dblite\n.svn/\n\n.DS_Store\n*.swp\nprofile\n\nDerivedData/\nbuild/\nGeneratedPluginRegistrant.h\nGeneratedPluginRegistrant.m\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n\nxcuserdata\n\n*.moved-aside\n\n*.pyc\n*sync/\nIcon?\n.tags*\n\n/Flutter/app.flx\n/Flutter/app.zip\n/Flutter/flutter_assets/\n/Flutter/App.framework\n/Flutter/Flutter.framework\n/Flutter/Generated.xcconfig\n/ServiceDefinitions.json\n\nPods/\n"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>App</string>\n  <key>CFBundleIdentifier</key>\n  <string>io.flutter.flutter.app</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>App</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>1.0</string>\n  <key>UIRequiredDeviceCapabilities</key>\n  <array>\n    <string>arm64</string>\n  </array>\n  <key>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n# platform :ios, '9.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\ndef parse_KV_file(file, separator='=')\n  file_abs_path = File.expand_path(file)\n  if !File.exists? file_abs_path\n    return [];\n  end\n  pods_ary = []\n  skip_line_start_symbols = [\"#\", \"/\"]\n  File.foreach(file_abs_path) { |line|\n      next if skip_line_start_symbols.any? { |symbol| line =~ /^\\s*#{symbol}/ }\n      plugin = line.split(pattern=separator)\n      if plugin.length == 2\n        podname = plugin[0].strip()\n        path = plugin[1].strip()\n        podpath = File.expand_path(\"#{path}\", file_abs_path)\n        pods_ary.push({:name => podname, :path => podpath});\n      else\n        puts \"Invalid plugin specification: #{line}\"\n      end\n  }\n  return pods_ary\nend\n\ntarget 'Runner' do\n  use_frameworks!\n\n  # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock\n  # referring to absolute paths on developers' machines.\n  system('rm -rf .symlinks')\n  system('mkdir -p .symlinks/plugins')\n\n  # Flutter Pods\n  generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig')\n  if generated_xcode_build_settings.empty?\n    puts \"Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first.\"\n  end\n  generated_xcode_build_settings.map { |p|\n    if p[:name] == 'FLUTTER_FRAMEWORK_DIR'\n      symlink = File.join('.symlinks', 'flutter')\n      File.symlink(File.dirname(p[:path]), symlink)\n      pod 'Flutter', :path => File.join(symlink, File.basename(p[:path]))\n    end\n  }\n\n  # Plugin Pods\n  plugin_pods = parse_KV_file('../.flutter-plugins')\n  plugin_pods.map { |p|\n    symlink = File.join('.symlinks', 'plugins', p[:name])\n    File.symlink(p[:path], symlink)\n    pod p[:name], :path => File.join(symlink, 'ios')\n  }\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    target.build_configurations.each do |config|\n      config.build_settings['ENABLE_BITCODE'] = 'NO'\n    end\n  end\nend\n"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -> Bool {\n    GeneratedPluginRegistrant.register(with: self)\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-20x20@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-29x29@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-40x40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-App-60x60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@1x.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-76x76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-App-83.5x83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"Icon-App-1024x1024@1x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchImage@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "content": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in this directory.\n\nYou 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."
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<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\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"12089\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Ydg-fD-yQy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xbc-2k-c8Z\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" image=\"LaunchImage\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YRO-k0-Ey4\">\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"1a2-6s-vTC\"/>\n                            <constraint firstItem=\"YRO-k0-Ey4\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"4X2-HB-R7a\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"LaunchImage\" width=\"168\" height=\"185\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<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\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Flutter View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"FlutterViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "ios/Runner/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>zhihudaily</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\""
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };\n\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\n\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };\n\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };\n\t\t9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; };\n\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };\n\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };\n\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };\n\t\tEB0651998627A6BC08E57EBD /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F21928A2C461EE664C8DA388 /* Pods_Runner.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t9705A1C41CF9048500538489 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,\n\t\t\t\t9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; };\n\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = \"<group>\"; };\n\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = \"<group>\"; };\n\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = \"<group>\"; };\n\t\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tF21928A2C461EE664C8DA388 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t97C146EB1CF9000F007C117D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,\n\t\t\t\t3B80C3941E831B6300D905FE /* App.framework in Frameworks */,\n\t\t\t\tEB0651998627A6BC08E57EBD /* Pods_Runner.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0C6D914149C756CDE70B051B /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF21928A2C461EE664C8DA388 /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34AF4E4C77695DC132C6AEDF /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9740EEB11CF90186004384FC /* Flutter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2D5378251FAA1A9400D5DBA9 /* flutter_assets */,\n\t\t\t\t3B80C3931E831B6300D905FE /* App.framework */,\n\t\t\t\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\n\t\t\t\t9740EEBA1CF902C7004384FC /* Flutter.framework */,\n\t\t\t\t9740EEB21CF90195004384FC /* Debug.xcconfig */,\n\t\t\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */,\n\t\t\t\t9740EEB31CF90195004384FC /* Generated.xcconfig */,\n\t\t\t);\n\t\t\tname = Flutter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146E51CF9000F007C117D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9740EEB11CF90186004384FC /* Flutter */,\n\t\t\t\t97C146F01CF9000F007C117D /* Runner */,\n\t\t\t\t97C146EF1CF9000F007C117D /* Products */,\n\t\t\t\t34AF4E4C77695DC132C6AEDF /* Pods */,\n\t\t\t\t0C6D914149C756CDE70B051B /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146EF1CF9000F007C117D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146EE1CF9000F007C117D /* Runner.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F01CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146F11CF9000F007C117D /* Supporting Files */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,\n\t\t\t);\n\t\t\tpath = Runner;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146F11CF9000F007C117D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t97C146ED1CF9000F007C117D /* Runner */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE3A3C064A2A1150EAB121034 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t9740EEB61CF901F6004384FC /* Run Script */,\n\t\t\t\t97C146EA1CF9000F007C117D /* Sources */,\n\t\t\t\t97C146EB1CF9000F007C117D /* Frameworks */,\n\t\t\t\t97C146EC1CF9000F007C117D /* Resources */,\n\t\t\t\t9705A1C41CF9048500538489 /* Embed Frameworks */,\n\t\t\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */,\n\t\t\t\tCAA558AFB9BBA78D9B607F6A /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Runner;\n\t\t\tproductName = Runner;\n\t\t\tproductReference = 97C146EE1CF9000F007C117D /* Runner.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t97C146E61CF9000F007C117D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = \"The Chromium Authors\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t97C146ED1CF9000F007C117D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 0910;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 97C146E51CF9000F007C117D;\n\t\t\tproductRefGroup = 97C146EF1CF9000F007C117D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t97C146ED1CF9000F007C117D /* Runner */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t97C146EC1CF9000F007C117D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,\n\t\t\t\t2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */,\n\t\t\t\t97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Thin Binary\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" thin\";\n\t\t};\n\t\t9740EEB61CF901F6004384FC /* Run Script */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"Run Script\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/bin/sh \\\"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\\\" build\";\n\t\t};\n\t\tCAA558AFB9BBA78D9B607F6A /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\",\n\t\t\t\t\"${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/flutter_webview_plugin/flutter_webview_plugin.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_webview_plugin.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tE3A3C064A2A1150EAB121034 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"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\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t97C146EA1CF9000F007C117D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t97C146FA1CF9000F007C117D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C146FB1CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t97C147001CF9000F007C117D /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147041CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t97C147061CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = arm64;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.starter;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t97C147071CF9000F007C117D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tARCHS = arm64;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Runner/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Flutter\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.yourcompany.starter;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Runner/Runner-Bridging-Header.h\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t97C146E91CF9000F007C117D /* Build configuration list for PBXProject \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147031CF9000F007C117D /* Debug */,\n\t\t\t\t97C147041CF9000F007C117D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget \"Runner\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t97C147061CF9000F007C117D /* Debug */,\n\t\t\t\t97C147071CF9000F007C117D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 97C146E61CF9000F007C117D /* Project object */;\n}\n"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0910\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n               BuildableName = \"Runner.app\"\n               BlueprintName = \"Runner\"\n               ReferencedContainer = \"container:Runner.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"97C146ED1CF9000F007C117D\"\n            BuildableName = \"Runner.app\"\n            BlueprintName = \"Runner\"\n            ReferencedContainer = \"container:Runner.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "lib/common/common_divider.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass CommonDivider {\n  static Widget buildDivider() {\n    return new Padding(\n      padding: const EdgeInsets.only(left: 12.0, right: 12.0),\n      child: new Divider(height: 1.0),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/common/common_loading_dialog.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass ProgressDialog{\n\n static Widget buildProgressDialog() {\n    return new Center(child: new CircularProgressIndicator());\n  }\n\n}\n"
  },
  {
    "path": "lib/common/common_retry.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass CommonRetry {\n  static Widget buildRetry(VoidCallback v) {\n    return new Center(\n      child: new Padding(\n          padding: const EdgeInsets.only(left: 10.0, top: 10.0, right: 10.0),\n          child: new InkWell(\n            borderRadius: new BorderRadius.all(new Radius.circular(10.0)),\n            onTap: v,\n            child: new Container(\n              width: 200.0,\n              alignment: Alignment.center,\n              padding: const EdgeInsets.only(\n                  left: 10.0, top: 10.0, right: 10.0, bottom: 10.0),\n              height: 48.0,\n              decoration: new BoxDecoration(\n                border: new Border.all(\n                  width: 1.0,\n                  color: Colors.blue,\n                ),\n                borderRadius: new BorderRadius.all(new Radius.circular(10.0)),\n              ),\n              child: new Text('网络异常，请检查后重试'),\n            ),\n          )),\n    );\n  }\n}\n\n\n"
  },
  {
    "path": "lib/common/common_snakeBar.dart",
    "content": "import 'package:flutter/material.dart';\n\n\nclass CommonSnakeBar{\n\n  static  buildSnakeBar(BuildContext context,String str) {\n    final snackBar = new SnackBar(content: new Text(str));\n    Scaffold.of(context).showSnackBar(snackBar);\n  }\n\n  //如果弹不出请用这个\n  static  buildSnakeBarByKey(final GlobalKey<ScaffoldState> key,BuildContext context,String str) {\n    final snackBar = new SnackBar(content: new Text(str));\n    key.currentState.showSnackBar(snackBar);\n  }\n\n}\n\n"
  },
  {
    "path": "lib/common/constant.dart",
    "content": "\nclass Constant {\n\n  static const  String baseUrl=\"https://news-at.zhihu.com/api/4/\";\n\n  //宽高常量\n  static const double bannerHeight = 200.0;\n  static const double normalItemHeight = 100.0;\n  static const double dateTimeItemHeight = 40.0;\n\n  //字符串常量\n  static const String todayHot = '今日热点';\n  static const String themeTitle = '专题';\n  static const String storyTitle = '详情';\n  static const String tips = '本页应该由banner+html组成，由于Flutter对Html支持的问题，以及暂时没找到好的解决方案，暂缓该功能，怕忘记了，故保留该页面，作为优化\\n请点击下面链接跳转到webview查看本文';\n\n\n  //SharedPreferences key\n  static const String spThemeCache = 'sp_theme_cache';\n  static const String spThemeCacheHours = 'sp_theme_cache_hours';\n\n\n  //time\n  static const int oneDay = 24 * 60 * 60;\n\n  //def headimg\n  static const String defHeadimg = 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRb0V6OlKdbsP-45kue1bb3QsVF2vV6Ncm_Nw3OzSwdTmWstfzY';\n\n  //comment pop\n  static const String popReply = '回复';\n  static const String popAgree = '赞同';\n  static const String popCopy = '复制';\n  static const String popReport = '举报';\n\n  //def bg\n  static const String defBg ='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529724791909&di=02909c10c9d8ed553d070522f4c11b44&imgtype=0&src=http%3A%2F%2Fimg17.3lian.com%2Fd%2Ffile%2F201702%2F14%2Fbf13787b4f6a5c346c07b8f10466a682.jpg';\n\n\n}\n"
  },
  {
    "path": "lib/exampleDemo/fadeAppTest.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass FadeAppTest extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Fade Demo',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new MyFadeTest(title: 'Fade Demo'),\n    );\n  }\n}\n\nclass MyFadeTest extends StatefulWidget {\n  MyFadeTest({Key key, this.title}) : super(key: key);\n  final String title;\n  @override\n  _MyFadeTest createState() => new _MyFadeTest();\n}\n\nclass _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin {\n  AnimationController controller;\n  CurvedAnimation curve;\n\n  @override\n  void initState() {\n    controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);\n    curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text(widget.title),\n      ),\n      body: new Center(\n          child: new Container(\n              child: new FadeTransition(\n                  opacity: curve,\n                  child: new FlutterLogo(\n                    size: 100.0,\n                  )))),\n      floatingActionButton: new FloatingActionButton(\n        tooltip: 'Fade',\n        child: new Icon(Icons.brush),\n        onPressed: () {\n          controller.forward();\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/isolateApp.dart",
    "content": "import 'dart:async';\nimport 'dart:convert';\nimport 'dart:isolate';\n\nimport 'package:flutter/material.dart';\nimport 'package:http/http.dart' as http;\n\nclass IsolateApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Sample App',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new SampleAppPage(),\n    );\n  }\n}\n\nclass SampleAppPage extends StatefulWidget {\n  SampleAppPage({Key key}) : super(key: key);\n\n  @override\n  _SampleAppPageState createState() => new _SampleAppPageState();\n}\n\nclass _SampleAppPageState extends State<SampleAppPage> {\n  List widgets = [];\n\n  @override\n  void initState() {\n    super.initState();\n    loadData();\n  }\n\n  showLoadingDialog() {\n    if (widgets.length == 0) {\n      return true;\n    }\n\n    return false;\n  }\n\n  getBody() {\n    if (showLoadingDialog()) {\n      return getProgressDialog();\n    } else {\n      return getListView();\n    }\n  }\n\n  getProgressDialog() {\n    return new Center(child: new CircularProgressIndicator());\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n        appBar: new AppBar(\n          title: new Text(\"Sample App\"),\n        ),\n        body: getBody());\n  }\n\n  ListView getListView() => new ListView.builder(\n      itemCount: widgets.length,\n      itemBuilder: (BuildContext context, int position) {\n        return getRow(position);\n      });\n\n  Widget getRow(int i) {\n    return new Padding(padding: new EdgeInsets.all(10.0), child: new Text(\"Row ${widgets[i][\"title\"]}\"));\n  }\n\n  loadData() async {\n    ReceivePort receivePort = new ReceivePort();\n    await Isolate.spawn(dataLoader, receivePort.sendPort);\n\n    // The 'echo' isolate sends it's SendPort as the first message\n    SendPort sendPort = await receivePort.first;\n\n    List msg = await sendReceive(sendPort, \"https://jsonplaceholder.typicode.com/posts\");\n\n    setState(() {\n      widgets = msg;\n    });\n  }\n\n// the entry point for the isolate\n  static dataLoader(SendPort sendPort) async {\n    // Open the ReceivePort for incoming messages.\n    ReceivePort port = new ReceivePort();\n\n    // Notify any other isolates what port this isolate listens to.\n    sendPort.send(port.sendPort);\n\n    await for (var msg in port) {\n      String data = msg[0];\n      SendPort replyTo = msg[1];\n\n      String dataURL = data;\n      http.Response response = await http.get(dataURL);\n      // Lots of JSON to parse\n//      replyTo.send(JSON.decode(response.body));\n    }\n  }\n\n  Future sendReceive(SendPort port, msg) {\n    ReceivePort response = new ReceivePort();\n    port.send([msg, response.sendPort]);\n    return response.first;\n  }\n\n}\n"
  },
  {
    "path": "lib/exampleDemo/layoutApp.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass LayoutApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.green,\n      ),\n      home: MyHomePage(title: 'Strawberry Pavlova Recipe'),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  MyHomePage({Key key, this.title}) : super(key: key);\n\n  final String title;\n\n  @override\n  _MyHomePageState createState() => _MyHomePageState();\n}\n\nclass _MyHomePageState extends State<MyHomePage> {\n  @override\n  Widget build(BuildContext context) {\n    var titleText = Container(\n      padding: EdgeInsets.all(0.0),\n      child: Text(\n        'Strawberry Pavlova',\n        style: TextStyle(\n          fontWeight: FontWeight.w800,\n          letterSpacing: 0.5,\n          fontSize: 30.0,\n        ),\n      ),\n    );\n\n    var subTitle = Text(\n      'Pavlova is a meringue-based dessert named after the Russian ballerina Anna Pavlova. Pavlova features a crisp crust and soft, light inside, topped with fruit and whipped cream.',\n      textAlign: TextAlign.center,\n      style: TextStyle(\n        fontFamily: 'Georgia',\n        fontSize: 25.0,\n      ),\n    );\n\n    var ratings = Container(\n      padding: EdgeInsets.all(20.0),\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n        children: [\n          Row(\n            mainAxisSize: MainAxisSize.min,\n            children: [\n              Icon(Icons.star, color: Colors.black),\n              Icon(Icons.star, color: Colors.black),\n              Icon(Icons.star, color: Colors.black),\n              Icon(Icons.star, color: Colors.black),\n              Icon(Icons.star, color: Colors.black),\n            ],\n          ),\n          Text(\n            '170 Reviews',\n            style: TextStyle(\n              color: Colors.black,\n              fontWeight: FontWeight.w800,\n              fontFamily: 'Roboto',\n              letterSpacing: 0.5,\n              fontSize: 20.0,\n            ),\n          ),\n        ],\n      ),\n    );\n\n    var descTextStyle = TextStyle(\n      color: Colors.black,\n      fontWeight: FontWeight.w800,\n      fontFamily: 'Roboto',\n      letterSpacing: 0.5,\n      fontSize: 18.0,\n      height: 2.0,\n    );\n\n    // DefaultTextStyle.merge allows you to create a default text\n    // style that is inherited by its child and all subsequent children.\n    var iconList = DefaultTextStyle.merge(\n      style: descTextStyle,\n      child: Container(\n        padding: EdgeInsets.all(20.0),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: [\n            Column(\n              children: [\n                Icon(Icons.kitchen, color: Colors.green[500]),\n                Text('PREP:'),\n                Text('25 min'),\n              ],\n            ),\n            Column(\n              children: [\n                Icon(Icons.timer, color: Colors.green[500]),\n                Text('COOK:'),\n                Text('1 hr'),\n              ],\n            ),\n            Column(\n              children: [\n                Icon(Icons.restaurant, color: Colors.green[500]),\n                Text('FEEDS:'),\n                Text('4-6'),\n              ],\n            ),\n          ],\n        ),\n      ),\n    );\n\n    var leftColumn = Container(\n      padding: EdgeInsets.fromLTRB(20.0, 30.0, 20.0, 20.0),\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.spaceAround,\n        children: [\n          titleText,\n          subTitle,\n          ratings,\n          iconList,\n        ],\n      ),\n    );\n\n    var mainImage = Image.asset(\n      'lib/images/pavlova.jpg',\n      fit: BoxFit.fill,\n    );\n\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(widget.title),\n      ),\n      body: Center(\n        child: Container(\n          margin: EdgeInsets.fromLTRB(0.0, 40.0, 0.0, 30.0),\n          height: 600.0,\n          child: Card(\n            child: Row(\n              crossAxisAlignment: CrossAxisAlignment.stretch,\n              children: [\n                Expanded(\n                    flex: 1,\n                    child: Container(\n                      width: 440.0,\n                      child: leftColumn,\n                    )),\n                Expanded(\n                  flex: 1,\n                  child: mainImage,\n                ),\n              ],\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/listItem.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\n\n\nclass ListItemApp extends StatelessWidget {\n  final List<ListItem> items;\n\n  ListItemApp({Key key, @required this.items}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    final title = 'Mixed List';\n\n    return new MaterialApp(\n      title: title,\n      home: new Scaffold(\n        appBar: new AppBar(\n          title: new Text(title),\n        ),\n        body: new ListView.builder(\n          // Let the ListView know how many items it needs to build\n          itemCount: items.length,\n          // Provide a builder function. This is where the magic happens! We'll\n          // convert each item into a Widget based on the type of item it is.\n          itemBuilder: (context, index) {\n            final item = items[index];\n\n            if (item is HeadingItem) {\n              return new ListTile(\n                title: new Text(\n                  item.heading,\n                  style: Theme.of(context).textTheme.headline,\n                ),\n              );\n            } else if (item is MessageItem) {\n              return new ListTile(\n                title: new Text(item.sender),\n                subtitle: new Text(item.body),\n              );\n            }\n          },\n        ),\n      ),\n    );\n  }\n}\n\n// The base class for the different types of items the List can contain\nabstract class ListItem {}\n\n// A ListItem that contains data to display a heading\nclass HeadingItem implements ListItem {\n  final String heading;\n\n  HeadingItem(this.heading);\n}\n\n// A ListItem that contains data to display a message\nclass MessageItem implements ListItem {\n  final String sender;\n  final String body;\n\n  MessageItem(this.sender, this.body);\n}\n"
  },
  {
    "path": "lib/exampleDemo/navigatorTest.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass NavigatorTest extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Fade Demo',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new MyFadeTest(title: 'Navigator Demo'),\n      routes: <String, WidgetBuilder> {\n        '/a': (BuildContext context) => new MyFadeTest(title: 'page A'),\n      },\n    );\n  }\n}\nclass MyFadeTest extends StatefulWidget {\n  MyFadeTest({Key key, this.title}) : super(key: key);\n  final String title;\n  @override\n  _MyFadeTest createState() => new _MyFadeTest();\n}\n\nclass _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin {\n  AnimationController controller;\n  CurvedAnimation curve;\n\n  @override\n  void initState() {\n    controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);\n    curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn);\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text(widget.title),\n      ),\n      body: new Center(\n          ),\n      floatingActionButton: new FloatingActionButton(\n        tooltip: 'Fade',\n        child: new Icon(Icons.arrow_forward_ios),\n        onPressed: () {\n          Navigator.of(context).pushNamed('/a');\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/platformChannel.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass ChannelApp extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'PlatformChannel App',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new PlatformChannel(),\n    );\n  }\n}\n\nclass PlatformChannel extends StatefulWidget {\n  @override\n  _PlatformChannelState createState() => new _PlatformChannelState();\n}\n\nclass _PlatformChannelState extends State<PlatformChannel> {\n  static const MethodChannel methodChannel =\n      const MethodChannel('samples.flutter.io/battery');\n  static const MethodChannel gotoChannel =\n      const MethodChannel('samples.flutter.io/intent');\n  static const EventChannel eventChannel =\n      const EventChannel('samples.flutter.io/charging');\n\n  String _batteryLevel = 'Battery level: unknown.';\n  String _chargingStatus = 'Battery status: unknown.';\n\n  Future<Null> _getBatteryLevel() async {\n    String batteryLevel;\n    try {\n      final int result = await methodChannel.invokeMethod('getBatteryLevel');\n      batteryLevel = 'Battery level: $result%.';\n    } on PlatformException {\n      batteryLevel = 'Failed to get battery level.';\n    }\n    setState(() {\n      _batteryLevel = batteryLevel;\n    });\n  }\n\n  Future<Null> _gotoActivity() async {\n    gotoChannel.invokeMethod('gotoActivity');\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);\n    _getBatteryLevel();\n  }\n\n  void _onEvent(Object event) {\n    setState(() {\n      _chargingStatus =\n          \"Battery status: ${event == 'charging' ? '' : 'dis'}charging.\";\n    });\n  }\n\n  void _onError(Object error) {\n    setState(() {\n      _chargingStatus = 'Battery status: unknown.';\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text('PlatformChannel App'),\n      ),\n      body: new Center(\n        child: new Column(\n          mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n          children: <Widget>[\n            new Column(\n              mainAxisAlignment: MainAxisAlignment.center,\n              children: <Widget>[\n                new Text(_batteryLevel, key: const Key('Battery level label')),\n                new Padding(\n                  padding: const EdgeInsets.all(16.0),\n                  child: new RaisedButton(\n                    child: const Text('Refresh'),\n                    onPressed: _getBatteryLevel,\n                  ),\n                ),\n              ],\n            ),\n            new Text(_chargingStatus),\n          ],\n        ),\n      ),\n      floatingActionButton: new FloatingActionButton(\n        tooltip: 'Fade',\n        child: new Icon(Icons.arrow_forward_ios),\n        onPressed: () {\n          _gotoActivity();\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/sampleApp1.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass SampleApp1 extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Sample App',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new SampleAppPage(),\n    );\n  }\n}\n\nclass SampleAppPage extends StatefulWidget {\n  SampleAppPage({Key key}) : super(key: key);\n\n  @override\n  _SampleAppPageState createState() => new _SampleAppPageState();\n}\n\nclass _SampleAppPageState extends State<SampleAppPage> {\n  // Default placeholder text\n  String textToShow = \"I Like Flutter\";\n\n  void _updateText() {\n    setState(() {\n      // update the text\n      textToShow = \"Flutter is Awesome!\";\n    });\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text(\"Sample App\"),\n      ),\n      body: new Center(child: new Text(textToShow)),\n      floatingActionButton: new FloatingActionButton(\n        onPressed: _updateText,\n        tooltip: 'Update Text',\n        child: new Icon(Icons.update),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/sampleApp2.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass SampleApp2 extends StatelessWidget {\n  // This widget is the root of your application.\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Sample App',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new SampleAppPage(),\n    );\n  }\n}\n\nclass SampleAppPage extends StatefulWidget {\n  SampleAppPage({Key key}) : super(key: key);\n\n  @override\n  _SampleAppPageState createState() => new _SampleAppPageState();\n}\n\nclass _SampleAppPageState extends State<SampleAppPage> {\n  // Default value for toggle\n  bool toggle = true;\n  void _toggle() {\n    setState(() {\n      toggle = !toggle;\n    });\n  }\n\n  _getToggleChild() {\n    if (toggle) {\n      return new Text('Toggle One');\n    } else {\n      return new MaterialButton(onPressed: () {}, child: new Text('Toggle Two'));\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text(\"Sample App\"),\n      ),\n      body: new Center(\n        child: _getToggleChild(),\n      ),\n      floatingActionButton: new FloatingActionButton(\n        onPressed: _toggle,\n        tooltip: 'Update Text',\n        child: new Icon(Icons.update),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/showLoading.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:http/http.dart' as http;\n\nclass ShowLoading extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: 'Sample App',\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new SampleAppPage(),\n    );\n  }\n}\n\nclass SampleAppPage extends StatefulWidget {\n  SampleAppPage({Key key}) : super(key: key);\n\n  @override\n  _SampleAppPageState createState() => new _SampleAppPageState();\n}\n\nclass _SampleAppPageState extends State<SampleAppPage> {\n  List widgets = [];\n\n  @override\n  void initState() {\n    super.initState();\n    loadData();\n  }\n\n  showLoadingDialog() {\n    if (widgets.length == 0) {\n      return true;\n    }\n\n    return false;\n  }\n\n  getBody() {\n    if (showLoadingDialog()) {\n      return getProgressDialog();\n    } else {\n      return getListView();\n    }\n  }\n\n  getProgressDialog() {\n    return new Center(child: new CircularProgressIndicator());\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n        appBar: new AppBar(\n          title: new Text(\"Sample App\"),\n        ),\n        body: getBody());\n  }\n\n  ListView getListView() => new ListView.builder(\n      itemCount: widgets.length,\n      itemBuilder: (BuildContext context, int position) {\n        return getRow(position);\n      });\n\n  Widget getRow(int i) {\n    return new Padding(padding: new EdgeInsets.all(10.0), child: new Text(\"Row ${widgets[i][\"title\"]}\"));\n  }\n\n  loadData() async {\n    String dataURL = \"https://jsonplaceholder.typicode.com/posts\";\n    http.Response response = await http.get(dataURL);\n    setState(() {\n      widgets = JSON.decode(response.body);\n    });\n  }\n}\n"
  },
  {
    "path": "lib/exampleDemo/startApp.dart",
    "content": "// Step 7 (Final): Change the app's theme\n\nimport 'package:flutter/material.dart';\nimport 'package:english_words/english_words.dart';\n\nclass StartApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    //MaterialApp widget本身是一个 widget 的 StatelessWidget 类\n    //在 Flutter 中，大多数时候一切都可以看作 widget , 包括 alignment，padding 和 layout\n    return new MaterialApp(\n      //这个不是标题栏title\n      title: 'Startup Name Generator',\n      //主题颜色\n      theme: new ThemeData(\n        primaryColor: Colors.black,\n      ),\n      //StatelessWidget嵌套了一个StatefulWidget\n      home: new RandomWords(),\n    );\n  }\n}\n\nclass RandomWords extends StatefulWidget {\n  //只需要实现一个方法，返回一个State\n  @override\n  createState() => new RandomWordsState();\n}\n\nclass RandomWordsState extends State<RandomWords> {\n  //保存建议的单词对\n  //final关键字让变量不能被再次赋值\n  //在Dart语言中使用下划线前缀标识符，会强制其变成私有的\n  final _suggestions = <WordPair>[];\n\n  //存储用户收藏的单词对\n  final _saved = new Set<WordPair>();\n\n  //自定义字体大小\n  final _biggerFont = const TextStyle(fontSize: 18.0);\n\n  @override\n  void initState() {\n    //重写initState，以完成仅需要执行一次的工作\n  }\n\n  //将 Widget build(BuildContext context)方法放在State上而不是StatefulWidget上是为了在继承StatefulWidget时能更加灵活\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text('Startup Name Generator111111111'),\n        //右上角事件，进行页面跳转\n        actions: <Widget>[\n          new IconButton(icon: new Icon(Icons.list), onPressed: _pushSaved)\n        ],\n      ),\n      body: _buildSuggestions(),\n    );\n  }\n\n  //构建显示建议单词对的ListView，当不知道要返回的组件属于什么类型，都可以定义为Widget\n  Widget _buildSuggestions() {\n    return new ListView.builder(\n      padding: const EdgeInsets.all(16.0),\n      // 对于每个建议的单词对都会调用一次itemBuilder，然后将单词对添加到ListTile行中\n      //不指定itemCount时，是一个无限长度的列表\n      itemBuilder: (context, i) {\n        // 在奇数行，该行添加一个分割线widget，来分隔相邻的词对。\n        if (i.isOdd) return new Divider();\n        // 在偶数行，该函数会为单词对添加一个ListTile row.\n        // 语法 \"i ~/ 2\" 表示i除以2，但返回值是整形（向下取整），比如i为：1, 2, 3, 4, 5\n        // 时，结果为0, 1, 1, 2, 2， 这可以计算出ListView中减去分隔线后的实际单词对数量\n        final index = i ~/ 2;\n        // 如果是建议列表中最后一个单词对\n        if (index >= _suggestions.length) {\n          // ...接着再生成10个单词对，然后添加到建议列表\n          _suggestions.addAll(generateWordPairs().take(10));\n        }\n        return _buildRow(_suggestions[index]);\n      },\n    );\n  }\n\n  Widget _buildRow(WordPair pair) {\n    final alreadySaved = _saved.contains(pair);\n    return new ListTile(\n      title: new Text(\n        pair.asPascalCase,\n        style: _biggerFont,\n      ),\n      trailing: new Icon(\n        alreadySaved ? Icons.album : Icons.favorite_border,\n        color: alreadySaved ? Colors.red : null,\n      ),\n      //在 _buildRow中让心形❤图标变得可以点击。如果单词条目已经添加到收藏夹中，\n      // 再次点击它将其从收藏夹中删除。当心形❤图标被点击时，函数调用setState()通知框架状态已经改变。\n      //只要添加了onTap属性，在MD主题下会有水波纹点击效果\n      onTap: () {\n        setState(\n          () {\n            if (alreadySaved) {\n              _saved.remove(pair);\n            } else {\n              _saved.add(pair);\n            }\n          },\n        );\n      },\n    );\n  }\n\n  void _pushSaved() {\n    //当用户点击导航栏中的列表图标时，建立一个路由并将其推入到导航管理器栈中。此操作会切换页面以显示新路由。\n    Navigator.of(context).push(\n      new MaterialPageRoute(\n        builder: (context) {\n          final tiles = _saved.map(\n            (pair) {\n              return new ListTile(\n                title: new Text(\n                  pair.asPascalCase,\n                  style: _biggerFont,\n                ),\n              );\n            },\n          );\n          final divided = ListTile\n              .divideTiles(\n                context: context,\n                tiles: tiles,\n              )\n              .toList();\n\n          return new Scaffold(\n            appBar: new AppBar(\n              title: new Text('Saved Suggestions'),\n            ),\n            body: new ListView(children: divided),\n          );\n        },\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/generated/i18n.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\n\n// ignore_for_file: non_constant_identifier_names\n// ignore_for_file: camel_case_types\n// ignore_for_file: prefer_single_quotes\n\n//This file is automatically generated. DO NOT EDIT, all your changes would be lost.\nclass S implements WidgetsLocalizations {\n  const S();\n\n  static const GeneratedLocalizationsDelegate delegate =\n      GeneratedLocalizationsDelegate();\n\n  static S of(BuildContext context) => Localizations.of<S>(context, S);\n\n  @override\n  TextDirection get textDirection => TextDirection.ltr;\n}\n\nclass en extends S {\n  const en();\n}\n\nclass GeneratedLocalizationsDelegate extends LocalizationsDelegate<S> {\n  const GeneratedLocalizationsDelegate();\n\n  List<Locale> get supportedLocales {\n    return const <Locale>[\n      Locale(\"en\", \"\"),\n    ];\n  }\n\n  LocaleListResolutionCallback listResolution({Locale fallback}) {\n    return (List<Locale> locales, Iterable<Locale> supported) {\n      if (locales == null || locales.isEmpty) {\n        return fallback ?? supported.first;\n      } else {\n        return _resolve(locales.first, fallback, supported);\n      }\n    };\n  }\n\n  LocaleResolutionCallback resolution({Locale fallback}) {\n    return (Locale locale, Iterable<Locale> supported) {\n      return _resolve(locale, fallback, supported);\n    };\n  }\n\n  Locale _resolve(Locale locale, Locale fallback, Iterable<Locale> supported) {\n    if (locale == null || !isSupported(locale)) {\n      return fallback ?? supported.first;\n    }\n\n    final Locale languageLocale = Locale(locale.languageCode, \"\");\n    if (supported.contains(locale)) {\n      return locale;\n    } else if (supported.contains(languageLocale)) {\n      return languageLocale;\n    } else {\n      final Locale fallbackLocale = fallback ?? supported.first;\n      return fallbackLocale;\n    }\n  }\n\n  @override\n  Future<S> load(Locale locale) {\n    final String lang = getLang(locale);\n    if (lang != null) {\n      switch (lang) {\n        case \"en\":\n          return SynchronousFuture<S>(const en());\n        default:\n        // NO-OP.\n      }\n    }\n    return SynchronousFuture<S>(const S());\n  }\n\n  @override\n  bool isSupported(Locale locale) =>\n      locale != null && supportedLocales.contains(locale);\n\n  @override\n  bool shouldReload(GeneratedLocalizationsDelegate old) => false;\n}\n\nString getLang(Locale l) => l == null\n    ? null\n    : l.countryCode != null && l.countryCode.isEmpty\n        ? l.languageCode\n        : l.toString();\n"
  },
  {
    "path": "lib/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:zhihudaily/exampleDemo/sampleApp2.dart';\nimport 'package:zhihudaily/exampleDemo/sampleApp1.dart';\nimport 'package:zhihudaily/exampleDemo/fadeAppTest.dart';\nimport 'package:zhihudaily/exampleDemo/navigatorTest.dart';\nimport 'package:zhihudaily/exampleDemo/platformChannel.dart';\nimport 'package:zhihudaily/zhihu/zhihudaily.dart';\nimport 'package:zhihudaily/exampleDemo/showLoading.dart';\nimport 'package:zhihudaily/exampleDemo/isolateApp.dart';\nimport 'package:zhihudaily/exampleDemo/listItem.dart';\nimport 'package:zhihudaily/exampleDemo/layoutApp.dart';\nimport 'package:zhihudaily/exampleDemo/startApp.dart';\nimport 'package:flutter/rendering.dart' show debugPaintSizeEnabled;\n\n//void main() => runApp(new LayoutApp());\n\nvoid main() {\n  debugPaintSizeEnabled = true;\n  runApp(StartApp());\n}\n"
  },
  {
    "path": "lib/model/ThemeModel.dart",
    "content": "class ThemeModel {\n  final String thumbnail;\n  final String description;\n  final int id;\n  final String name;\n  final int color;\n\n  const ThemeModel(\n      {this.thumbnail, this.description, this.id, this.name, this.color});\n\n  ThemeModel.fromJson(Map<String, dynamic> json)\n      : thumbnail = json['thumbnail'],\n        description = json['description'],\n        id = json['id'],\n        color = json['color'],\n        name = json['name'];\n}\n"
  },
  {
    "path": "lib/model/base_model.dart",
    "content": "\n\n\nclass BaseModel<T>{\n\n  final int code;\n\n  final String errorMsg;\n\n  final  T data;\n\n  const BaseModel({this.code, this.errorMsg, this.data});\n\n}\n"
  },
  {
    "path": "lib/model/homePageModel.dart",
    "content": "class HomePageModel {\n  static const int itemTypeNormal = 0;\n  static const int itemTypeBanner = 1;\n\n  final List images;\n  final int type;\n  final int id;\n  final String title;\n\n  int itemType = itemTypeNormal;\n\n  HomePageModel({this.images, this.type, this.id, this.title});\n\n  setItemType(int type) {\n    itemType = type;\n  }\n\n  HomePageModel.fromJson(Map<String, dynamic> json)\n      : images = json['images'],\n        type = json['type'],\n        id = json['id'],\n        title = json['title'];\n}\n\nclass TopStoriesModel {\n  final String image;\n  final int type;\n  final int id;\n  final String title;\n\n  const TopStoriesModel({this.image, this.type, this.id, this.title});\n\n  TopStoriesModel.fromJson(Map<String, dynamic> json)\n      : image = json['image'],\n        type = json['type'],\n        id = json['id'],\n        title = json['title'];\n}\n"
  },
  {
    "path": "lib/model/theme_list_model.dart",
    "content": "class ThemeListModel {\n  final String description;\n\n  final String name;\n\n  final String background;\n\n  final String image;\n\n  final List stories;\n\n  final List editors;\n\n  const ThemeListModel(\n      {this.description,\n      this.name,\n      this.background,\n      this.image,\n      this.stories,\n      this.editors});\n}\n\nclass ThemeListStoriesModel {\n\n  static const int itemTypeNormal = 0;\n  static const int itemTypeBanner = 1;\n  static const int itemTypeEditor = 2;\n\n  final List images;\n  final int type;\n  final int id;\n  final String title;\n\n  int itemType = itemTypeNormal;\n\n  setItemType(int type) {\n    itemType = type;\n  }\n\n  ThemeListStoriesModel({this.images, this.type, this.id, this.title});\n\n  ThemeListStoriesModel.fromJson(Map<String, dynamic> json)\n      : images = json['images'],\n        type = json['type'],\n        id = json['id'],\n        title = json['title'];\n}\n\nclass ThemeListEditorsModel {\n  final String url;\n  final String bio;\n  final String avatar;\n  final int id;\n  final String name;\n\n  const ThemeListEditorsModel(\n      {this.url, this.bio, this.avatar, this.id, this.name});\n\n  ThemeListEditorsModel.fromJson(Map<String, dynamic> json)\n      : url = json['url'],\n        bio = json['bio'],\n        id = json['id'],\n        name = json['name'],\n        avatar = json['avatar'];\n}\n"
  },
  {
    "path": "lib/net/apis.dart",
    "content": "class Apis {\n\n  //首页数据\n  static const String latest = \"news/latest\";\n\n  //首页数据 跟日期 example：news/before/20131119\n  static const String before =\"news/before/\" ;\n\n  //详情 跟id example：news/3892357\n  static const String detail = \"news/\";\n\n  //评论数 点赞数 跟id example：news/3892357\n  static const String story_extra = \"story-extra/\";\n\n  //长评论详情 跟id example:story/8997528/long-comments\n  static const String long_comment = \"story/id/long-comments\";\n\n  //短评论详情 跟id\n  static const String short_comment = \"story/id/short-comments\";\n\n  //查看主题日报分类列表\n  static const String themes = \"themes\";\n\n  //查看某个主题的列表 跟id example：themes/13\n  static const String themes_list = \"theme/\";\n\n  //查看某个主题的列表 跟tid story_id 是每次请求的最后一条 example：theme/13/before/4731018\n  static const String themes_list_before = \"/before/\";\n\n\n}\n"
  },
  {
    "path": "lib/net/dio_factory.dart",
    "content": "import 'package:dio/dio.dart';\n\n//总觉得怪怪的，但是打印出来确实是只有一个dio对象。。\n\nclass DioFactory {\n  static Dio _dio;\n\n  static DioFactory _instance;\n\n  static DioFactory getInstance() {\n    if (_instance == null) {\n      _instance = new DioFactory._();\n      _instance._init();\n    }\n    return _instance;\n  }\n\n  DioFactory._();\n\n  _init(){\n    _dio = new Dio();\n  }\n\n  getDio() {\n    return _dio;\n  }\n}\n\n//测试是否是单例\nvoid main() {\n  print(DioFactory.getInstance().getDio()  == DioFactory.getInstance().getDio());\n}\n"
  },
  {
    "path": "lib/presenter/mvp.dart",
    "content": "\nabstract class IView<T> {\n  setPresenter(T presenter);\n}\n\nabstract class IPresenter{\n  init();\n}\n"
  },
  {
    "path": "lib/presenter/theme_list_presenter.dart",
    "content": "import 'package:zhihudaily/model/base_model.dart';\nimport 'package:zhihudaily/model/theme_list_model.dart';\nimport 'package:zhihudaily/presenter/mvp.dart';\n\nabstract class ThemeListPresenter implements IPresenter {\n  loadThemeList(String themeId, String lastId);\n}\n\nabstract class ThemeListView implements IView<ThemeListPresenter> {\n  void onLoadThemeListSuc(BaseModel<ThemeListModel> model);\n  void onLoadThemeListFail();\n}\n"
  },
  {
    "path": "lib/presenter/theme_list_presenter_impl.dart",
    "content": "import 'package:zhihudaily/presenter/theme_list_presenter.dart';\nimport 'package:zhihudaily/repository/theme_list_repository.dart';\nimport 'package:zhihudaily/repository/theme_list_repository_impl.dart';\n\nclass ThemeListPresenterImpl implements ThemeListPresenter {\n\n  ThemeListView _view;\n\n  ThemeListRepository _repository;\n\n  ThemeListPresenterImpl(this._view) {\n    _view.setPresenter(this);\n  }\n\n\n  @override\n  loadThemeList(String themeId, String lastId) {\n    assert(_view != null);\n    _repository.loadThemeList(themeId,lastId).then((data) {\n      _view.onLoadThemeListSuc(data);\n    }).catchError((error) {\n      _view.onLoadThemeListFail();\n    });\n  }\n\n  @override\n  init() {\n    _repository = new ThemeListRepositoryImpl();\n  }\n\n}\n"
  },
  {
    "path": "lib/repository/theme_list_repository.dart",
    "content": "import 'dart:async';\n\nimport 'package:zhihudaily/model/theme_list_model.dart';\nimport 'package:zhihudaily/model/base_model.dart';\n\nabstract class ThemeListRepository {\n\n  Future<BaseModel<ThemeListModel>> loadThemeList(String themeId,String lastId);\n\n}\n"
  },
  {
    "path": "lib/repository/theme_list_repository_impl.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:zhihudaily/common/constant.dart';\nimport 'package:zhihudaily/model/base_model.dart';\nimport 'package:zhihudaily/model/theme_list_model.dart';\nimport 'package:zhihudaily/repository/theme_list_repository.dart';\nimport 'package:zhihudaily/net/apis.dart';\nimport 'package:zhihudaily/net/dio_factory.dart';\nimport 'package:dio/dio.dart';\n\nclass ThemeListRepositoryImpl implements ThemeListRepository {\n  @override\n  Future<BaseModel<ThemeListModel>> loadThemeList(\n      String themeId, String lastId) {\n    return _getThemeList(themeId, lastId);\n  }\n}\n\nFuture<BaseModel<ThemeListModel>> _getThemeList(\n    String themeId, String lastId) async {\n  Dio dio =DioFactory.getInstance().getDio();\n\n  String url;\n\n\n  if (null == lastId) {\n    url = Constant.baseUrl + Apis.themes_list + themeId;\n  } else {\n    url = Constant.baseUrl +\n        Apis.themes_list +\n        themeId +\n        Apis.themes_list_before +\n        lastId;\n  }\n\n  print(url);\n\n\n  int code;\n\n  String errorMsg;\n\n  ThemeListModel themeListModel;\n\n  BaseModel<ThemeListModel> model;\n\n  try {\n    Response response = await dio.get(url);\n\n    code = response.statusCode;\n\n    if (response.statusCode == HttpStatus.OK) {\n\n      String description = response.data['description'];\n\n      String name = response.data['name'];\n\n      String image = response.data['image'];\n\n      String background = response.data['background'];\n\n      List stories = response.data['stories'];\n\n      List editors = response.data['editors'];\n\n      List<ThemeListEditorsModel> editorList;\n\n      List<ThemeListStoriesModel> storiesList = stories.map((model) {\n        return new ThemeListStoriesModel.fromJson(model);\n      }).toList();\n\n      //topStories根据接口只有当天有，过去时间的topStories为空\n      if (editors != null && editors.isNotEmpty) {\n        editorList = editors.map((model) {\n          return new ThemeListEditorsModel.fromJson(model);\n        }).toList();\n      }\n\n      themeListModel = new ThemeListModel(\n          description: description,\n          background: background,\n          name: name,\n          image: image,\n          stories: storiesList,\n          editors: editorList);\n    } else {\n      errorMsg = '服务器异常';\n    }\n  } catch (exception) {\n    errorMsg = '您的网络似乎出了什么问题';\n  } finally {\n    model = new BaseModel(code: code, errorMsg: errorMsg, data: themeListModel);\n  }\n\n  return model;\n}\n"
  },
  {
    "path": "lib/utils/RouterUtils.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_webview_plugin/flutter_webview_plugin.dart';\nimport 'package:http/http.dart' as http;\nimport 'package:zhihudaily/zhihu/themeListPage.dart';\nimport 'package:zhihudaily/zhihu/zhihudaily.dart';\n\nclass RouterUtils {\n\n  static routeToMain(BuildContext context) {\n    Navigator.of(context).push(new PageRouteBuilder(\n        opaque: false,\n        pageBuilder: (BuildContext context, _, __) {\n          return new ZhihuDailyApp();\n        },\n        transitionsBuilder: (_, Animation<double> animation, __, Widget child) {\n          return new FadeTransition(\n            opacity: animation,\n            child: new FadeTransition(\n              opacity:\n                  new Tween<double>(begin: 0.5, end: 1.0).animate(animation),\n              child: child,\n            ),\n          );\n        }));\n  }\n\n  static startWebView(BuildContext context, int id) async {\n    String dataURL = \"https://news-at.zhihu.com/api/4/news/$id\";\n    http.Response response = await http.get(dataURL);\n\n    Navigator.of(context).push(new PageRouteBuilder(\n        opaque: false,\n        pageBuilder: (BuildContext context, _, __) {\n          return new WebviewScaffold(\n            url: json.decode(response.body)[\"share_url\"],\n            appBar: new AppBar(\n              title: new Text(json.decode(response.body)[\"title\"]),\n            ),\n            withZoom: true,\n            withLocalStorage: true,\n          );\n        },\n        transitionsBuilder: (_, Animation<double> animation, __, Widget child) {\n          return new FadeTransition(\n            opacity: animation,\n            child: new FadeTransition(\n              opacity:\n              new Tween<double>(begin: 0.5, end: 1.0).animate(animation),\n              child: child,\n            ),\n          );\n        }));\n\n  }\n\n  static route2ThemeList(BuildContext context, String themeId) {\n    Navigator.of(context).push(new PageRouteBuilder(\n        opaque: false,\n        pageBuilder: (BuildContext context, _, __) {\n          return new ThemeListPage(themeId);\n        },\n        transitionsBuilder: (_, Animation<double> animation, __, Widget child) {\n          return new FadeTransition(\n            opacity: animation,\n            child: new FadeTransition(\n              opacity:\n                  new Tween<double>(begin: 0.5, end: 1.0).animate(animation),\n              child: child,\n            ),\n          );\n        }));\n  }\n}\n"
  },
  {
    "path": "lib/widget/drawerContent.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:zhihudaily/model/ThemeModel.dart';\nimport 'package:http/http.dart' as http;\nimport 'dart:convert';\nimport 'package:zhihudaily/common/common_loading_dialog.dart';\nimport 'package:zhihudaily/utils/RouterUtils.dart';\n\nclass DrawerBody extends StatefulWidget {\n  @override\n  DrawerState createState() => new DrawerState();\n}\n\nclass DrawerState extends State<DrawerBody> {\n  List<ThemeModel> themes = [];\n\n  @override\n  void initState() {\n    super.initState();\n    loadData();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      backgroundColor: Colors.white,\n      body: buildBody(),\n    );\n  }\n\n  Widget buildBody() {\n    if (null != themes && themes.isNotEmpty) {\n      return new Column(\n        children: <Widget>[\n          buildDrawer(),\n          buildItem(),\n          new Divider(height: 1.0),\n          buildList()\n        ],\n      );\n    } else {\n      return ProgressDialog.buildProgressDialog();\n    }\n  }\n\n  Widget buildDrawer() {\n    return new UserAccountsDrawerHeader(\n      onDetailsPressed: () {},\n      accountName: new Text('MelonRice'),\n      accountEmail: new Text('rice@bmqb.com'),\n      currentAccountPicture: new CircleAvatar(\n        backgroundImage: new NetworkImage(\n            'https://wx3.sinaimg.cn/mw690/44485fa4gy1ft4q8gk1vmj205k05kjsn.jpg'),\n      ),\n    );\n  }\n\n  Widget buildItem() {\n    return new InkWell(\n      onTap: () {\n        Navigator.of(context).pop();\n        RouterUtils.routeToMain(context);\n      },\n      child: new Padding(\n          padding: const EdgeInsets.only(left: 10.0),\n          child: new Row(\n            children: <Widget>[\n              new Icon(Icons.home, color: Colors.blue, size: 36.0),\n              new Padding(\n                  padding: const EdgeInsets.only(left: 10.0, right: 10.0),\n                  child: new Text('首页',\n                      style:\n                          new TextStyle(color: Colors.blue, fontSize: 18.0))),\n            ],\n          )),\n    );\n  }\n\n  Widget buildList() {\n    return new MediaQuery.removePadding(\n      context: context,\n      // DrawerHeader consumes top MediaQuery padding.\n      removeTop: true,\n      child: new Expanded(\n          child: new ListView(\n        children: <Widget>[\n          new Column(\n            mainAxisSize: MainAxisSize.min,\n            crossAxisAlignment: CrossAxisAlignment.stretch,\n            children: themes.map((ThemeModel model) {\n              return buildOtherItem(model);\n            }).toList(),\n          ),\n        ],\n      )),\n    );\n  }\n\n  Widget buildOtherItem(ThemeModel model) {\n    return new InkWell(\n      onTap: () {\n        Navigator.of(context).pop();\n        RouterUtils.route2ThemeList(context, '${model.id}');\n      },\n      child: new ListTile(\n        trailing: new Icon(Icons.add, color: Colors.grey[300]),\n        title: new Text('${model.name}',\n            style: new TextStyle(\n                fontWeight: FontWeight.bold,\n                color: Colors.grey[700],\n                fontSize: 16.0)),\n      ),\n    );\n  }\n\n  loadData() async {\n    String dataURL = \"https://news-at.zhihu.com/api/4/themes\";\n    http.Response response = await http.get(dataURL);\n    List others = json.decode(response.body)[\"others\"];\n    themes = others.map((model) {\n      return new ThemeModel.fromJson(model);\n    }).toList();\n\n    setState(() {});\n  }\n}\n\nclass DrawerPage extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      backgroundColor: Colors.white,\n      body: new DrawerBody(),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/widget/homeBanner.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\nimport 'package:zhihudaily/model/homePageModel.dart';\nimport 'package:zhihudaily/utils/RouterUtils.dart';\n\nclass HomeBanner extends StatefulWidget {\n  final List<TopStoriesModel> bannerList;\n\n  HomeBanner(this.bannerList);\n\n  @override\n  State<StatefulWidget> createState() => new HomeBannerState();\n}\n\nclass HomeBannerState extends State<HomeBanner> {\n  List<Widget> _indicators = [];\n\n  int _curIndicatorsIndex = 0;\n\n  Timer timer;\n\n  PageController pageController = new PageController(initialPage: 0);\n\n  @override\n  void initState() {\n    super.initState();\n    timer = new Timer.periodic(new Duration(seconds: 3), (timer) {\n      pageController.animateToPage(_curIndicatorsIndex == _indicators.length - 1 ? 0 : _curIndicatorsIndex + 1,\n          duration: new Duration(milliseconds: 500), curve: Curves.linear);\n    });\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    timer.cancel();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return buildBanner();\n  }\n\n  Widget buildBanner() {\n    return new Container(\n      height: 220.0,\n      child: new Stack(\n        children: <Widget>[\n          buildPagerView(),\n          buildIndicators(),\n        ],\n      ),\n    );\n  }\n\n  Widget buildPagerView() {\n    return new PageView.builder(\n      controller: pageController,\n      itemBuilder: (BuildContext context, int index) {\n        return buildItem(context, index);\n      },\n      itemCount: widget.bannerList.length,\n      onPageChanged: (index) {\n        _changePage(index);\n      },\n    );\n  }\n\n  Widget buildItem(BuildContext context, int index) {\n    TopStoriesModel banner = widget.bannerList[index];\n\n    return new GestureDetector(\n      onTap: () {\n        RouterUtils.startWebView(context, banner.id);\n      },\n      child: new Image.network(\n        banner.image,\n        fit: BoxFit.fitWidth,\n        height: 200.0,\n      ),\n    );\n  }\n\n  Widget buildIndicators() {\n    _initIndicators();\n    return new Align(\n      alignment: Alignment.bottomCenter,\n      child: new Container(\n        color: Colors.black38,\n        height: 60.0,\n        width: double.infinity,\n        child: new Column(\n          children: <Widget>[\n            new Padding(\n              padding: const EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 0.0),\n              child: new Text(widget.bannerList[_curIndicatorsIndex].title,\n                  maxLines: 1,\n                  style: new TextStyle(color: Colors.white, fontSize: 16.0)),\n            ),\n            new Padding(\n              padding: const EdgeInsets.fromLTRB(0.0, 16.0, 0.0, 0.0),\n              child: new SizedBox(\n                width: widget.bannerList.length * 12.0,\n                height: 6.0,\n                child: new Row(\n                  children: _indicators,\n                  mainAxisAlignment: MainAxisAlignment.spaceEvenly,\n                ),\n              ),\n            )\n          ],\n        ),\n      ),\n    );\n  }\n\n  _initIndicators() {\n    _indicators.clear();\n    for (int i = 0; i < widget.bannerList.length; i++) {\n      _indicators.add(new CircleAvatar(\n        radius: 6.0,\n        backgroundColor: i == _curIndicatorsIndex ? Colors.white : Colors.grey,\n      ));\n    }\n  }\n\n  _changePage(int index) {\n    _curIndicatorsIndex = index;\n    setState(() {});\n  }\n}\n"
  },
  {
    "path": "lib/zhihu/storyItem.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:zhihudaily/model/homePageModel.dart';\n\nclass StoryItem extends StatelessWidget {\n  StoryItem({Key key, this.onTap, @required this.detail}) : super(key: key);\n\n  static const double height = 120.0;\n  final HomePageModel detail;\n  final VoidCallback onTap;\n\n  @override\n  Widget build(BuildContext context) {\n    final ThemeData theme = Theme.of(context);\n    theme.textTheme.headline.copyWith(color: Colors.white);\n    final TextStyle descriptionStyle = theme.textTheme.title;\n\n    return new SafeArea(\n      top: false,\n      bottom: false,\n      child: new Container(\n        padding: const EdgeInsets.all(0.0),\n        height: height,\n        child: new Card(\n            child: new InkWell(\n          onTap: onTap,\n          child: new Row(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: <Widget>[\n              // photo and title\n              new Expanded(\n                child: new Padding(\n                  padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 0.0),\n                  child: new DefaultTextStyle(\n                    softWrap: true,\n                    overflow: TextOverflow.ellipsis,\n                    style: descriptionStyle,\n                    child: new Column(\n                      crossAxisAlignment: CrossAxisAlignment.start,\n                      children: <Widget>[\n                        new Padding(\n                          padding: const EdgeInsets.only(bottom: 8.0),\n                          child: new Text(\n                            detail.title,\n                            maxLines: 3,\n                            style: descriptionStyle.copyWith(\n                                fontSize: 16.0, color: Colors.black87),\n                          ),\n                        ),\n                      ],\n                    ),\n                  ),\n                ),\n              ),\n              new SizedBox(\n                width: 115.0,\n                child: new Padding(\n                  padding: const EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 8.0),\n                  child: new Stack(\n                    children: <Widget>[\n                      new Positioned.fill(\n                          child: new Container(\n                        foregroundDecoration: new BoxDecoration(\n                          image: new DecorationImage(\n                              image: new NetworkImage(detail.images[0]),\n                              fit: BoxFit.cover),\n                        ),\n                      )),\n                    ],\n                  ),\n                ),\n              ),\n            ],\n          ),\n        )),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "lib/zhihu/themeListPage.dart",
    "content": "import 'dart:async';\nimport 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:transparent_image/transparent_image.dart';\nimport 'package:zhihudaily/common/common_divider.dart';\nimport 'package:zhihudaily/common/common_snakeBar.dart';\nimport 'package:zhihudaily/common/constant.dart';\nimport 'package:zhihudaily/model/base_model.dart';\nimport 'package:zhihudaily/model/theme_list_model.dart';\nimport 'package:zhihudaily/presenter/theme_list_presenter.dart';\nimport 'package:zhihudaily/presenter/theme_list_presenter_impl.dart';\nimport 'package:zhihudaily/utils/RouterUtils.dart';\nimport 'package:zhihudaily/widget/drawerContent.dart';\n\nclass ThemeListPage extends StatefulWidget {\n  final String themeId;\n\n  ThemeListPage(this.themeId, {Key key}) : super(key: key);\n\n  @override\n  _ThemeListPageState createState() {\n    _ThemeListPageState view = new _ThemeListPageState();\n    ThemeListPresenter presenter = new ThemeListPresenterImpl(view);\n    presenter.init();\n    return view;\n  }\n}\n\nenum AppBarBehavior { normal, pinned, floating, snapping }\n\nclass _ThemeListPageState extends State<ThemeListPage>\n    implements ThemeListView {\n  final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =\n  new GlobalKey<RefreshIndicatorState>();\n\n//  static final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<\n//      ScaffoldState>();\n\n  final double _appBarHeight = 256.0;\n\n  AppBarBehavior _appBarBehavior = AppBarBehavior.pinned;\n\n  String _title = Constant.themeTitle;\n\n  ScrollController _scrollController;\n\n  ThemeListPresenter _themeListPresenter;\n\n  List<ThemeListStoriesModel> _normalDatas = [];\n\n  List<ThemeListEditorsModel> _editorDatas = [];\n\n  List<Widget> _widgets = [];\n\n  String _barBg = Constant.defBg;\n\n  ThemeListModel _themeListModel;\n\n  bool _isSlideUp = false;\n\n  int _curStoryId;\n\n  void _scrollListener() {\n    //滑到最底部刷新\n    if (_scrollController.position.pixels ==\n        _scrollController.position.maxScrollExtent) {\n      _loadData();\n    }\n  }\n\n  Future<Null> _refreshData() {\n    _isSlideUp = false;\n\n    final Completer<Null> completer = new Completer<Null>();\n\n    _themeListPresenter.loadThemeList(widget.themeId, null);\n\n    completer.complete(null);\n\n    return completer.future;\n  }\n\n  Future<Null> _loadData() {\n    _isSlideUp = true;\n\n    final Completer<Null> completer = new Completer<Null>();\n\n    _themeListPresenter.loadThemeList(widget.themeId, '$_curStoryId');\n\n    setState(() {});\n\n    completer.complete(null);\n\n    return completer.future;\n  }\n\n  @override\n  void initState() {\n    super.initState();\n    _scrollController = new ScrollController()..addListener(_scrollListener);\n    _refreshData();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    _scrollController.removeListener(_scrollListener);\n  }\n\n  Widget _buildEditor() {\n    //横向控件的集合\n    List<Widget> editors = [];\n\n    //主编\n    Widget lableWidget = new Padding(\n      padding: const EdgeInsets.only(right: 12.0),\n      child: new Text(\n        '主编',\n        style: new TextStyle(fontSize: 14.0),\n      ),\n    );\n\n    editors.add(lableWidget);\n\n    //循环加入主编的头像\n    for (ThemeListEditorsModel model in _editorDatas) {\n      Widget headView = new InkWell(\n        onTap: () {\n          //todo\n//          RouterUtils.route2Web(context, model.name, model.url);\n        },\n        child: new Padding(\n            padding: const EdgeInsets.only(\n                left: 6.0, right: 6.0, top: 12.0, bottom: 12.0),\n            child: new CircleAvatar(\n              radius: 12.0,\n              backgroundImage: new NetworkImage(model.avatar),\n            )),\n      );\n      editors.add(headView);\n    }\n\n    //组装\n    return new Column(\n      children: <Widget>[\n        new Padding(\n          padding: const EdgeInsets.only(left: 12.0, right: 12.0),\n          child: new Row(\n            children: editors,\n          ),\n        ),\n        CommonDivider.buildDivider(),\n      ],\n    );\n  }\n\n  Widget _buildNormalItem(ThemeListStoriesModel item) {\n    final List images = item.images;\n    final String title = item.title;\n    final int id = item.id;\n    bool hasImage = (null != images && images.isNotEmpty);\n\n    if (hasImage) {\n      return new InkWell(\n          onTap: () {\n            RouterUtils.startWebView(context, id);\n          },\n          child: new Padding(\n              padding: const EdgeInsets.only(left: 12.0, right: 12.0),\n              child: new SizedBox(\n                height: Constant.normalItemHeight,\n                child: new Column(\n                  children: <Widget>[\n                    new Row(\n                      children: <Widget>[\n                        new Expanded(\n                          child: new Text(\n                            title,\n                            style: new TextStyle(\n                                fontSize: 16.0, fontWeight: FontWeight.w300),\n                          ),\n                        ),\n                        new Padding(\n                          padding: const EdgeInsets.all(8.0),\n                          child: new SizedBox(\n                            height: 80.0,\n                            width: 80.0,\n                            child: new Image.network(images[0]),\n                          ),\n                        )\n                      ],\n                    ),\n                    new Expanded(\n                      child: new Align(\n                        alignment: Alignment.bottomCenter,\n                        child: CommonDivider.buildDivider(),\n                      ),\n                    ),\n                  ],\n                ),\n              )));\n    } else {\n      return new InkWell(\n          onTap: () {\n            RouterUtils.startWebView(context, id);\n          },\n          child: new Padding(\n              padding: const EdgeInsets.only(left: 12.0, right: 12.0),\n              child: new SizedBox(\n                height: Constant.normalItemHeight,\n                child: new Column(\n                  children: <Widget>[\n                    new Row(\n                      children: <Widget>[\n                        new Expanded(\n                          child: new SizedBox(\n                            height: Constant.normalItemHeight,\n                            child: new Align(\n                              alignment: Alignment.centerLeft,\n                              child: new Text(\n                                title,\n                                style: new TextStyle(\n                                    fontSize: 16.0,\n                                    fontWeight: FontWeight.w300),\n                              ),\n                            ),\n                          ),\n                        ),\n                      ],\n                    ),\n                    new Expanded(\n                      child: new Align(\n                        alignment: Alignment.bottomCenter,\n                        child: CommonDivider.buildDivider(),\n                      ),\n                    ),\n                  ],\n                ),\n              )));\n    }\n  }\n\n  Widget _buildNewItem(ThemeListStoriesModel item) {\n    Widget widget;\n\n    switch (item.itemType) {\n      case ThemeListStoriesModel.itemTypeEditor:\n        widget = _buildEditor();\n        break;\n      case ThemeListStoriesModel.itemTypeNormal:\n        widget = _buildNormalItem(item);\n        break;\n    }\n    return widget;\n  }\n\n  _refreshItems() {\n    for (ThemeListStoriesModel model in _normalDatas) {\n      _widgets.add(_buildNewItem(model));\n    }\n\n    setState(() {});\n  }\n\n  Widget _buildList(BuildContext context) {\n    var content = new CustomScrollView(\n      //没有铺满也可以滑动\n      physics: AlwaysScrollableScrollPhysics(),\n      controller: _scrollController,\n      slivers: <Widget>[\n        new SliverAppBar(\n          expandedHeight: _appBarHeight,\n          pinned: _appBarBehavior == AppBarBehavior.pinned,\n          floating: _appBarBehavior == AppBarBehavior.floating ||\n              _appBarBehavior == AppBarBehavior.snapping,\n          snap: _appBarBehavior == AppBarBehavior.snapping,\n          flexibleSpace: new FlexibleSpaceBar(\n            //标题\n            title: Text('$_title'),\n            centerTitle: true,\n            //背景图\n            background: new FadeInImage.memoryNetwork(\n                placeholder: kTransparentImage,\n                image: _barBg,\n                fit: BoxFit.fitHeight),\n          ),\n        ),\n        new SliverList(\n          delegate: new SliverChildListDelegate(\n              new List<Widget>.generate(_normalDatas.length, (int i) {\n                return _buildNewItem(_normalDatas[i]);\n              })),\n        ),\n      ],\n    );\n\n    var _refreshIndicator = new RefreshIndicator(\n      key: _refreshIndicatorKey,\n      onRefresh: _refreshData,\n      child: content,\n    );\n\n    return _refreshIndicator;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n//      key: _scaffoldKey,\n      backgroundColor: Colors.white,\n      drawer: new Drawer(\n        child: new DrawerPage(),\n      ),\n      body: _buildList(context),\n    );\n  }\n\n  @override\n  setPresenter(ThemeListPresenter presenter) {\n    _themeListPresenter = presenter;\n  }\n\n  @override\n  void onLoadThemeListFail() {\n    // TODO: implement onLoadThemeListFail\n  }\n\n  @override\n  void onLoadThemeListSuc(BaseModel<ThemeListModel> model) {\n    if (!mounted) return; //异步处理，防止报错\n\n    if (model.code != HttpStatus.OK) {\n      CommonSnakeBar.buildSnakeBar(context, model.errorMsg);\n      return;\n    }\n\n    if (_isSlideUp) {\n      List<ThemeListStoriesModel> normalList = model.data.stories;\n      _normalDatas.addAll(normalList);\n    } else {\n      _themeListModel = model.data;\n      List<ThemeListStoriesModel> normalList = model.data.stories;\n      List<ThemeListEditorsModel> editorList = _themeListModel.editors;\n\n      _themeListModel = model.data;\n\n      _barBg = _themeListModel.image;\n\n      _title = _themeListModel.name;\n\n      _normalDatas.clear();\n      _editorDatas.clear();\n\n      _normalDatas = normalList;\n      _editorDatas = editorList;\n\n      _curStoryId = _normalDatas[0].id;\n\n      if (null != _editorDatas && _editorDatas.isNotEmpty) {\n        ThemeListStoriesModel fakeItem = new ThemeListStoriesModel();\n        fakeItem.setItemType(ThemeListStoriesModel.itemTypeEditor);\n        _normalDatas.insert(0, fakeItem);\n      }\n\n    }\n\n    _refreshItems();\n  }\n}\n"
  },
  {
    "path": "lib/zhihu/zhihudaily.dart",
    "content": "import 'dart:convert';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:http/http.dart' as http;\nimport 'package:zhihudaily/model/homePageModel.dart';\nimport 'package:zhihudaily/utils/RouterUtils.dart';\nimport 'package:zhihudaily/widget/drawerContent.dart';\nimport 'package:zhihudaily/widget/homeBanner.dart';\nimport 'package:zhihudaily/zhihu/storyItem.dart';\n\nclass ZhihuDailyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return new MaterialApp(\n      title: '知乎日报',\n      color: Colors.grey,\n      theme: new ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: new SampleAppPage(),\n    );\n  }\n}\n\nclass SampleAppPage extends StatefulWidget {\n  SampleAppPage({Key key}) : super(key: key);\n\n  @override\n  _SampleAppPageState createState() => new _SampleAppPageState();\n}\n\nclass _SampleAppPageState extends State<SampleAppPage> {\n  List<HomePageModel> homePageDataList = new List<HomePageModel>();\n  List<TopStoriesModel> topBannerModel;\n\n  @override\n  void initState() {\n    super.initState();\n    loadData();\n  }\n\n  Widget buildItem(BuildContext context, int position) {\n    Widget widget;\n\n    HomePageModel item = homePageDataList[position];\n\n    switch (item.itemType) {\n      case HomePageModel.itemTypeBanner:\n        widget = new HomeBanner(topBannerModel);\n        break;\n      case HomePageModel.itemTypeNormal:\n        widget = getItem(context, position);\n        break;\n    }\n\n    return widget;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return new Scaffold(\n      appBar: new AppBar(\n        title: new Text(\"知乎日报\"),\n      ),\n      body: new ListView.builder(\n          itemCount: homePageDataList.length,\n          itemBuilder: (BuildContext context, int position) {\n            return buildItem(context, position);\n          }),\n      drawer: new Drawer(\n        child: new DrawerPage(),\n      )\n    );\n  }\n\n  Widget getItem(BuildContext context, int i) {\n    return new Container(\n        margin: const EdgeInsets.only(left: 4.0, right: 4.0),\n        child: new StoryItem(\n          detail: homePageDataList[i],\n          onTap: () {\n            RouterUtils.startWebView(context, homePageDataList[i].id);\n          },\n        ));\n  }\n\n\n  loadData() async {\n    String dataURL = \"https://news-at.zhihu.com/api/4/news/latest\";\n    http.Response response = await http.get(dataURL);\n\n    List banner = json.decode(response.body)[\"top_stories\"];\n    List storise = json.decode(response.body)[\"stories\"];\n\n    if (storise.isNotEmpty) {\n      homePageDataList = storise.map((model) {\n        return new HomePageModel.fromJson(model);\n      }).toList();\n    }\n\n    if (banner.isNotEmpty) {\n      topBannerModel = banner.map((model) {\n        return new TopStoriesModel.fromJson(model);\n      }).toList();\n\n      HomePageModel top = new HomePageModel();\n      top.setItemType(HomePageModel.itemTypeBanner);\n      homePageDataList.insert(0, top);\n    }\n\n    setState(() {});\n  }\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: zhihudaily\ndescription: A new Flutter project.\n\ndependencies:\n  flutter:\n    sdk: flutter\n\n  flutter_webview_plugin: \"^0.3.0+2\"\n  transparent_image: \"^0.1.0\"\n  dio: \"^1.0.9\"\n  http: \"^0.12.0\"\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^0.1.2\n  english_words: ^3.1.5\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n\n# For information on the generic Dart part of this file, see the\n# following page: https://www.dartlang.org/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\n\n  # The following line ensures that the Material Icons font is\n  # included with your application, so that you can use the icons in\n  # the material Icons class.\n  uses-material-design: true\n  assets:\n      - lib/images/pavlova.jpg\n\n  # To add assets to your application, add an assets section, like this:\n  # assets:\n  #  - images/a_dot_burr.jpeg\n  #  - images/a_dot_ham.jpeg\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.io/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.io/assets-and-images/#from-packages\n\n  # To add custom fonts to your application, add a fonts section here,\n  # in this \"flutter\" section. Each entry in this list should have a\n  # \"family\" key with the font family name, and a \"fonts\" key with a\n  # list giving the asset and other descriptors for the font. For\n  # example:\n  # fonts:\n  #   - family: Schyler\n  #     fonts:\n  #       - asset: fonts/Schyler-Regular.ttf\n  #       - asset: fonts/Schyler-Italic.ttf\n  #         style: italic\n  #   - family: Trajan Pro\n  #     fonts:\n  #       - asset: fonts/TrajanPro.ttf\n  #       - asset: fonts/TrajanPro_Bold.ttf\n  #         weight: 700\n  #\n  # For details regarding fonts from package dependencies,\n  # see https://flutter.io/custom-fonts/#from-packages\n"
  },
  {
    "path": "res/values/strings_en.arb",
    "content": "{}"
  },
  {
    "path": "test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter\n// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to\n// find child widgets in the widget tree, read text, and verify that the values of widget properties\n// are correct.\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter_test/flutter_test.dart';\nimport 'package:zhihudaily/exampleDemo/sampleApp1.dart';\nimport 'package:zhihudaily/main.dart';\n\nvoid main() {\n  testWidgets('Counter increments smoke test', (WidgetTester tester) async {\n    // Build our app and trigger a frame.\n    await tester.pumpWidget(new SampleApp1());\n\n    // Verify that our counter starts at 0.\n    expect(find.text('0'), findsOneWidget);\n    expect(find.text('1'), findsNothing);\n\n    // Tap the '+' icon and trigger a frame.\n    await tester.tap(find.byIcon(Icons.add));\n    await tester.pump();\n\n    // Verify that our counter has incremented.\n    expect(find.text('0'), findsNothing);\n    expect(find.text('1'), findsOneWidget);\n  });\n}\n"
  }
]