[
  {
    "path": ".fvm/fvm_config.json",
    "content": "{\n  \"flutterSdkVersion\": \"3.16.9\",\n  \"flavors\": {}\n}"
  },
  {
    "path": ".gitattributes",
    "content": "*.swift linguist-language=dart\n*.kt linguist-language=dart\n*.java linguist-language=dart\n*.rb linguist-language=dart\n"
  },
  {
    "path": ".github/labeler.yml",
    "content": "repo:\n  - ./*\n  \nios:\n  - ios/**/*.swift\n\nandroid:\n  - android/**/*.java\n  - android/**/*.kt\n\nflutter:\n  - src/**/*.dart\n"
  },
  {
    "path": ".github/workflows/greetings.yml",
    "content": "name: Greetings\n\non: [pull_request, issues]\n\njobs:\n  greeting:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/first-interaction@v1\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        issue-message: 'first issue 🚀'\n        pr-message: 'first pr 👍'\n"
  },
  {
    "path": ".github/workflows/label.yml",
    "content": "# This workflow will triage pull requests and apply a label based on the\n# paths that are modified in the pull request.\n#\n# To use this workflow, you will need to set up a .github/labeler.yml\n# file with configuration.  For more information, see:\n# https://github.com/actions/labeler\n\nname: Labeler\non: [pull_request]\n\njobs:\n  label:\n\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/labeler@v2\n      with:\n        repo-token: \"${{ secrets.GITHUB_TOKEN }}\"\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "content": "# This is a basic workflow to help you get started with Actions\n\nname: Publisher\n\non:\n  push:\n    branches: [master]\n\n  workflow_dispatch:\n\nenv:\n  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\njobs:\n  check_version:\n    name: Check Version\n    runs-on: ubuntu-latest\n    outputs:\n      git_tag_name: ${{ steps.tag_check.outputs.git_tag_name }}\n    steps:\n      - uses: actions/checkout@v2 # https://github.com/actions/checkout\n\n      - uses: CumulusDS/get-yaml-paths-action@v0.1.0\n        id: get_package_version\n        with:\n          file: pubspec.yaml\n          version: version\n      # debug\n      - name: Output package version\n        run: echo 'version:' ${{ steps.get_package_version.outputs.version }}\n\n      - uses: dudo/tag_check@v1.0.2\n        id: tag_check\n        with:\n          version: ${{ steps.get_package_version.outputs.version }}\n          git_tag_prefix: v\n\n  push_tag:\n    name: Push Tag\n    needs: check_version\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2 # https://github.com/actions/checkout\n\n      - name: push tag\n        uses: anothrNick/github-tag-action@1.36.0\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          CUSTOM_TAG: ${{ needs.check_version.outputs.git_tag_name }}\n          SOURCE: master\n\n  publish_pub:\n    name: Publish new Pub version\n    needs: check_version\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n      - name: Publish Dart/Flutter package\n        uses: sakebook/actions-flutter-pub-publisher@v1.3.1\n        with:\n          credential: ${{ secrets.PUB_PUBLISHER_CREDENTIAL_JSON }}\n          flutter_package: true\n          skip_test: true\n          dry_run: false\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.dart_tool/\n.idea\n\n.packages\n.pub/\n\nbuild/\n.flutter-plugins\n\nandroid-aar-repo\nios-frameworks\n.faraday.json"
  },
  {
    "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: bbfbf1770cca2da7c82e887e4e4af910034800b6\n  channel: stable\n\nproject_type: plugin\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"name\": \"g_faraday attach\",\n      \"type\": \"dart\",\n      \"request\": \"attach\",\n      \"program\": \"example/lib/main.dart\"\n    },\n    {\n      \"name\": \"g_faraday debug\",\n      \"program\": \"example/lib/main.dart\",\n      \"request\": \"launch\",\n      \"type\": \"dart\"\n    },\n  ]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"cSpell.words\": [\n    \"anothr\",\n    \"ARGB\",\n    \"BUPT\",\n    \"cocoapod\",\n    \"cocoapods\",\n    \"Dealloc\",\n    \"Deallocation\",\n    \"dudo\",\n    \"executables\",\n    \"fluro\",\n    \"fullscreen\",\n    \"Podfile\",\n    \"recase\",\n    \"sakebook\",\n    \"Scrollable\",\n    \"simctl\",\n    \"xcrun\"\n  ]\n}"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# 1.0.2\n* Fix NPE when platform plugin delegate is null\n\n# 1.0.1\n\n* migrate to flutter 3.16.9\n* ios add FaradayNavigationControllerBarHiddenProtocol\n\n# 1.0.0\n\n* migrate to flutter 3.0.5\n* rewrite android plugin\n\n## 1.0.0-beta.1\n\n* migrate to flutter 3.0.3\n* rewrite android plugin\n\n## 0.7.2\n\n* migrate to flutter 2.5.0\n* fix typo\n  \n## 0.7.1\n\n* fix refresh error when save file\n\n## 0.7.0\n\n* migrate to flutter 2.0\n\n## 0.6.0-nullsafety.33\n\n* fix typo\n\n## 0.6.0-nullsafety.32\n\n* add top navigator accessor\n* add top context accessor\n* compatible with objc\n\n## 0.5.1-nullsafety.31\n\n* add navigator observer\n  \n## 0.5.1-nullsafety.30\n\n* refactor logger\n* improve widget dispose logic after native container dealloc\n\n## 0.5.1-nullsafety.29\n\n* [android] fix status bar style\n\n## 0.5.1-nullsafety.28\n\n* [ios] reset additionalSafeAreaInsets\n* [android] refactor `initEngine` to `startEngine`\n  \n## 0.5.1-nullsafety.27\n\n* [ios] post status bar notification\n\n## 0.5.1-nullsafety.26\n\n* [android] downgrade minSdkVersion to 16\n  \n## 0.5.1-nullsafety.25\n\n* [ios] fix ios notification issue\n\n## 0.5.1-nullsafety.24\n\n* [ios] refine swipe pop gesture\n* refine example project\n\n## 0.5.1-nullsafety.23\n\n* remove useless asset\n\n## 0.5.1-nullsafety.22\n\n* [ios] resize channel buffer\n  \n## 0.5.1-nullsafety.21\n\n* remove navigator anchor\n* [android] refine `onNewIntent`\n\n## 0.5.1-nullsafety.20\n\n* add anchor native api\n* [android] fix splash reuse issue\n\n## 0.5.1-nullsafety.19\n\n* fix page dealloc logic\n  \n## 0.5.1-nullsafety.18\n\n* add popToAnchor native api\n\n## 0.5.1-nullsafety.17\n\n* compatible xcode 11.5\n\n## 0.5.1-nullsafety.16\n\n* support pop to any flutter route\n\n## 0.5.1-nullsafety.15\n\n* refine options default value\n\n## 0.5.1-nullsafety.14\n\n* refine options api\n\n## 0.5.1-nullsafety.13\n\n* downgrade flutter version to 1.24.0-10.2.pre\n\n## 0.5.1-nullsafety.12\n\n* revert FaradayBrdige of api\n\n## 0.5.1-nullsafety.11\n\n* refine notification api\n\n## 0.5.1-nullsafety.10\n\n* [android] fix splash issue\n\n## 0.5.1-nullsafety.9\n\n* [android] make route&params public\n* add more examples\n\n## 0.5.1-nullsafety.8\n\n* [ios] refine callback api\n* migrate to `Flutter 1.25.0-8.1.pre`\n\n## 0.5.0-nullsafety.7\n\n* [ios] refine push api\n* refine nullsafety\n\n## 0.5.0-nullsafety.6\n\n* [ios] fix pop gesture logic\n\n## 0.5.0-nullsafety.5\n\n* upgrade json package to 4.0.0.nullsafety.2\n\n## 0.5.0-nullsafety.4\n\n* upgrade json package to 4.0.0.nullsafety.1\n\n## 0.5.0-nullsafety.3\n\n* [ios] fix callback issue\n* add invokeMapMethod&invokeListMethod for common channel\n\n## 0.5.0-nullsafety.2\n\n* fix navigator onGenerateInitialRouteIssue\n\n## 0.5.0-nullsafety.1\n\n* [ios] make flutter engine public\n\n## 0.5.0-nullsafety.0\n\n* support null safety basically\n\n## 0.4.3-pre.3\n\n* refine android activity lifecycle\n\n## 0.4.3-pre.2\n\n* detach activity before destroy\n\n## 0.4.3-pre.1\n\n* test publish by github action\n\n## 0.4.3-pre.0\n\n* refactor activity builder api\n\n## 0.4.2\n\n* add examples\n\n## 0.4.2-pre.2\n\n* fix Activity animation issue\n* fix ViewController swipe back gesture\n\n## 0.4.2-pre.1\n\n* Support custom splash screen with pure color\n\n## 0.4.2-pre.0\n\n* Support activity all launch modes\n* Support custom transition animation\n* Support transparent background\n\n## 0.4.1-pre.1\n\n* Support Activity animation\n* Support Fragment\n\n## 0.4.1-pre.0\n\n* Remove Page.Hidden event\n* Custom FlutterActivity\n\n## 0.4.0\n\n* Support hybrid route stack.\n* Automatically handle ios navigation bar hidden/show.\n* Support `WillPopScope` widget.\n* Send/Receive global notification.\n* Complete documentation.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to g_faraday\n\n## 1. Things you will need\n\n- Linux, Mac OS X, or Windows.\n- [git](https://git-scm.com) (used for source version control).\n- An IDE such as [Android Studio](https://developer.android.com/studio) or [Visual Studio Code](https://code.visualstudio.com/).\n\n## 2. Forking & cloning the repository\n\n- Ensure all the dependencies described in the previous section are installed.\n- Fork `https://github.com/gfaraday/g_faraday` into your own GitHub account. If\n  you already have a fork, and are now installing a development environment on\n  a new machine, make sure you've updated your fork so that you don't use stale\n  configuration options from long ago.\n- `git clone git@github.com:<your_name_here>/g_faraday.git`\n- `git remote add upstream git@github.com:g_faraday/g_faraday.git` (So that you\n  fetch from the master repository, not your clone, when running `git fetch`\n  et al.)\n\n## TODO\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2020 Faraday Team (http://www.faraday.中国)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "README.md",
    "content": "# ![log](./doc/images/logo.png)  Faraday [English](./README_EN.md)\n\n![Build](https://img.shields.io/github/workflow/status/gfaraday/g_faraday/Publisher/master?logo=github&style=for-the-badge)\n![pub_Version](https://img.shields.io/pub/v/g_faraday?include_prereleases&style=for-the-badge&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjAwcHgiIGhlaWdodD0iNjAwcHgiIHZpZXdCb3g9IjAgMCA2MDAgNjAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPmZhcmFkYXk8L3RpdGxlPgogICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSIxMC42ODAxNzA0JSIgeTE9IjI2Ljk5MzAyODclIiB4Mj0iNzIuMTEzMDU3NiUiIHkyPSI1Mi45MTkyNjU3JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJmYXJhZGF5IiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPGcgaWQ9ImZsdXR0ZXItc2Vla2xvZ28uY29tIj4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgZmlsbD0iI0VCRkNGNCIgcG9pbnRzPSIyMDQuNTY2ODQ1IDAgMCAyMjEuOTI4NzQ2IDYzLjMxNzM1OSAyOTAuNjE5OTQ2IDMzMS4yMDI5ODkgMCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBmaWxsPSIjRUJGQ0Y0IiBwb2ludHM9IjIwMy4zNDU5MzggMjA0LjI0MTI0IDkzLjk5MDAzNzQgMzIyLjYyMDg5OSAxNTcuNDQzOTAxIDM5Mi4zMzY5MjcgMjIwLjU0MzM2OCAzMjQuMDMwNjU4IDMzMS4yMDI5ODkgMjA0LjI0MTI0Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGw9IiNFQkZDRjQiIHBvaW50cz0iMTU3LjM5NjAxNSAzOTIuODE5ODQxIDIwNS40NDUxNzMgNDQ0LjgwOTk3MyAzMzEuMjAyOTg5IDQ0NC44MDk5NzMgMjIwLjUxMTk2NSAzMjQuNTI1NjA2Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGw9IiNFQkZDRjQiIHBvaW50cz0iOTMuMjQ0MDg0NyAzMjMuODY0MiAxNTYuNjA3OTA4IDI1NS4wOTk3MyAyMjAuODAxOTkzIDMyNC41MDgyMzIgMTU3LjU1ODAwMSAzOTMuMTQ0MjA1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtb3BhY2l0eT0iMC44IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBwb2ludHM9IjE1Ny4zOTYwMTUgMzkyLjMzNjkyNyAyMTAuMzIyOTA0IDM3My4zMzA1NzYgMjE1LjU4MDMyNCAzMjkuMzY5MjcyIj48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iZmx1dHRlci1zZWVrbG9nby5jb20iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Ny43OTcwMTEsIDE1NC4xOTAwMjcpIiBmaWxsPSIjRUJGQ0Y0Ij4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSIyMDQuNTY2ODQ1IDAgMCAyMjEuOTI4NzQ2IDYzLjMxNzM1OSAyOTAuNjE5OTQ2IDMzMS4yMDI5ODkgMCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBwb2ludHM9IjIwMy4zNDU5MzggMjA0LjI0MTI0IDkzLjk5MDAzNzQgMzIyLjYyMDg5OSAxNTcuNDQzOTAxIDM5Mi4zMzY5MjcgMjIwLjU0MzM2OCAzMjQuMDMwNjU4IDMzMS4yMDI5ODkgMjA0LjI0MTI0Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIHBvaW50cz0iMTU3LjM5NjAxNSAzOTIuODE5ODQxIDIwNS40NDUxNzMgNDQ0LjgwOTk3MyAzMzEuMjAyOTg5IDQ0NC44MDk5NzMgMjIwLjUxMTk2NSAzMjQuNTI1NjA2Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIHBvaW50cz0iOTMuMjQ0MDg0NyAzMjMuODY0MiAxNTYuNjA3OTA4IDI1NS4wOTk3MyAyMjAuODAxOTkzIDMyNC41MDgyMzIgMTU3LjU1ODAwMSAzOTMuMTQ0MjA1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==)\n![Flutter_Version](https://img.shields.io/badge/Flutter-stable-blue?style=for-the-badge&logo=flutter)\n![License](https://img.shields.io/github/license/gfaraday/g_faraday?style=for-the-badge)\n\n[一个`Flutter`混合栈开发解决方案](https://juejin.cn/post/6911985354488676365)\n\n## Features\n\n- [x] 支持`ios`、`android`、`flutter`三端所有原生路由(页面切换)跳转行为\n- [x] 支持混合栈(native -> flutter -> native)路由跳转(popTo、replace ...)\n- [x] 支持flutter页面作为root页面\n- [x] 支持flutter作为子页面加入原生堆栈\n- [x] 支持flutter作为弹出页面(背景透明到native层)\n- [x] [页面间回调传值完整支持](doc/callback.md)\n- [x] [iOS导航条自动隐藏/显示](doc/ios_navigation_bar.md)\n- [x] `WillPopScope`拦截滑动返回(ios)或者返回按键键(android)\n- [x] [发送/接收全局通知](doc/notification.md)\n- [x] 支持自定义页面切换动画\n- [x] 支持完整的生命周期监听\n- [ ] 单元测试\n- [x] 完整的文档(7/10)\n\n## 使用`g_faraday`的APP\n\n| 序号 | 名称   | 版本号 | iOS                                                                            | Android                                                         |\n| ---- | ------ | ------ | ------------------------------------------------------------------------------ | --------------------------------------------------------------- |\n| 0    | 寓小二 | 8.0.0  | [AppStore](https://apps.apple.com/cn/app/寓小二-公寓系统定制专家/id1081403007) | [应用宝](https://a.app.qq.com/o/simple.jsp?pkgname=com.yuxiaor) |\n\n> 您的app也在使用?[联系我们](#Communication)\n\n## Show Cases\n\n![demo](doc/images/demo.png)\n\n## Example App\n\n[Android下载apk](https://github.com/gfaraday/g_faraday/releases/download/v0.5.0-nullsafety.3/appv2.apk)\n\n<!-- [iOS下载app](https://github.com/gfaraday/g_faraday/releases/download/0.4.2/example.app.zip)\n> [模拟器安装app](doc/ios-simulator-install.md) -->\n\n## 设计原则\n\n- 对原有平台最小侵入\n- 对现有代码最小改动\n- API尽量保持和原有平台一致\n\n## 更新策略\n\n_Flutter **stable channel** 发布后 **一周内**适配发布对应的`g_faraday`版本_\n\n## Requirements\n\n- Flutter 3.0.5 • channel stable\n- iOS 10.0+ Xcode 12.0+ Swift 5.1+\n- Android minSdkVersion 16 Kotlin 1.4.10+\n\n## 版本对应关系\n\n| g_faraday           | flutter                                                                   | cocoapods | remark        |\n| ------------------- | ------------------------------------------------------------------------- | --------- | ------------- |\n| ^1.0.0       | Flutter 3.0.5 • channel stable • `https://github.com/flutter/flutter.git`   | any       | recommend        |\n| ^1.0.0-beta.1       | Flutter 3.0.3 • channel stable • `https://github.com/flutter/flutter.git`   | any       | not recommend        |\n| ^0.7.2              | Flutter 2.5.0 • channel stable • `https://github.com/flutter/flutter.git` | any       | not recommend     |\n| ^0.7.0              | Flutter 2.0.0 • channel stable                                            | any       | not recommend |\n| ^0.5.1-nullsafety.0 | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n| ^0.5.0-nullsafety.0 | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n| ^0.4.0              | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n\n## 快速开始\n\n如果您已经有其他类似框架使用经验，可以直接查看[Example](example/)浏览最佳实践。\n\n> run example project: `flutter run --no-sound-null-safety`\n\n### 添加依赖\n\n``` yaml\ndependencies:\n  g_faraday: ^0.7.0\n```\n\n### Flutter 端集成\n\nflutter侧的集成工作，主要是注册需要从原生打开的页面。\n\n``` dart\n\n// 0x00 定义 route\nfinal route = faraday.wrapper((settings) {\n    switch (settings.name) {\n    case 'first_page':\n        return CupertinoPageRoute(builder: (context) => Text('First Page'));\n    case 'second_page':\n        return CupertinoPageRoute(builder: (context) => Text('Second Page'));\n    }\n    return CupertinoPageRoute(builder: (context) => Text(settings.name));\n});\n\n// 0x01 将 route 赋给你的app widget\nCupertinoApp(onGenerateRoute: (_) => route);\n\n// 0x02 flutter 侧集成完毕，接下来你可以选择 集成iOS/Android\n```\n\n> 注意不管是`CupertinoApp`还是`MaterialApp`都不要设置`home`\n\n### iOS 集成\n\n[Objective-C集成看这里](./example_objc_only/README.md)\n\n为了实现从`Flutter`端打开原生页面的应用场景，所以我们需要实现一个打开原生页面的protocol\n\n``` swift\n\n// 0x00 实现 `FaradayNavigationDelegate`\nextension AppDelegate: FaradayNavigationDelegate {\n\n    func push(_ name: String, arguments: Any?, options: [String : Any]?, callback token: CallbackToken) {\n\n        let isFlutter = options?[\"flutter\"] as? Bool ?? false\n        let isPresent = options?[\"present\"] as? Bool ?? false\n\n        let vc = isFlutter ? FaradayFlutterViewController(name, arguments: arguments) : FirstViewController(name， arguments: arguments)\n\n        let topMost = UIViewController.fa.topMost\n        if (isPresent) {\n            // 此处注意\n            // vc.modalPresentationStyle 不能是`pageSheet`\n            // 如果的确需要这种UI效果，可以配合透明背景，在Flutter侧实现\n            topMost?.present(vc, animated: true, completion: nil)\n        } else {\n            topMost?.navigationController?.pushViewController(vc, animated: true)\n        }\n\n        // 非常重要\n        // 如果此处不调用 `enableCallback` 那么flutter侧`await Navigator`则永远不会返回\n        vc.fa.enableCallback(with: token)\n    }\n}\n\n// 0x01 在 `application: didFinishLaunchingWithOptions`中启动flutter engine\nFaraday.default.startFlutterEngine(navigatorDelegate: self)\n\n\n// 0x02 打开一个flutter 页面\nlet vc = FaradayFlutterViewController(\"first_page\", arguments: nil)\nnavigationController?.pushViewController(vc, animated: true)\n\n// 0x03 集成完毕\n```\n\n### Android 集成\n\n为了实现从`Flutter`端打开原生页面的应用场景，所以我们需要实现一组打开原生页面的接口\n\n``` kotlin\n\n// 0x00 实现 navigator\nclass SimpleFlutterNavigator : FaradayNavigator {\n\n    companion object {\n        const val KEY_ARGS = \"_args\"\n    }\n\n    override fun create(name: String, arguments: Serializable?, options: HashMap<String, *>?): Intent? {\n        val context = Faraday.getCurrentActivity() ?: return null\n\n        val isFlutterRoute = options?.get(\"flutter\") == true\n\n        if (isFlutterRoute) {\n            // singleTask 模式\n            val builder = FaradayActivity.builder(name, arguments)\n\n            // 你看到的绿色的闪屏就是这个\n            builder.backgroundColor = Color.WHITE\n            builder.activityClass = SingleTaskFlutterActivity::class.java\n\n            return builder.build(context);\n        }\n\n        when (name) {\n            \"flutter2native\" -> {\n                return Intent(context, FlutterToNativeActivity::class.java)\n            }\n            \"native2flutter\" -> {\n                return Intent(context, Native2FlutterActivity::class.java)\n            }\n            \"tabContainer\" -> {\n                return Intent(context, TabContainerActivity::class.java)\n            }\n            else -> {\n                val intent = Intent(Intent.ACTION_VIEW)\n                intent.data = Uri.parse(name)\n                intent.putExtra(KEY_ARGS, arguments)\n                return intent\n            }\n        }\n\n    }\n\n    override fun pop(result: Serializable?) {\n        val activity = Faraday.getCurrentActivity() ?: return\n        if (result != null) {\n            activity.setResult(Activity.RESULT_OK, Intent().apply { putExtra(KEY_ARGS, result) })\n        }\n        activity.finish()\n    }\n\n    override fun enableSwipeBack(enable: Boolean) {\n\n    }\n\n}\n\n// 0x01 在 Application 的onCreate方法中启动FlutterEngine\nif (!Faraday.startFlutterEngine(this, SimpleFlutterNavigator())) {\n    GeneratedPluginRegistrant.registerWith(Faraday.engine)\n}\n\n// 0x02 打开一个Flutter页面\nval intent = FaradayActivity.build(context, routeName, params)\ncontext.startActivity(intent)\n\n```\n\n## faraday 全家桶 (推荐)\n\n在进行Flutter混合开发时会遇到很多相似的问题，我们提供了相应的解决方案大家玩的开心。\n\n- [路由](doc/route.md)\n- [桥接原生方法](doc/bridge.md)\n- [网络请求](doc/net.md)\n- [JSON](doc/json.md)\n- [命令行工具 | 代码生成](https://github.com/gfaraday/cli)\n- [vscode 插件 | 自动补全](https://github.com/gfaraday/faraday_extension)\n- [打包发布 | CI/CD](./doc/ci.md)\n\n## FAQ\n\n### 是否支持使用第三方路由框架?\n\n支持。\n\nexample中提供了[fluro](https://github.com/lukepighetti/fluro)和[getx](https://github.com/jonataslaw/getx)的实现范例\n\n### 是否支持使用`url`配置路由?\n\n支持。\n\n- ios推荐使用[⛵️ URLNavigator](https://github.com/devxoul/URLNavigator)\n- android[原生支持](https://developer.android.com/training/app-links/deep-linking)\n- flutter推荐[fluro](https://github.com/lukepighetti/fluro)\n\n可以保证3端统一使用url进行路由管理。\n\n### 打包时提示 `failed to load module 'g_faraday'`\n\n请使用`xcode 12.3`及以上版本\n\n## Communication\n\n[扫码加入微信群，请备注 faraday](https://github.com/KevinGong2013)\n\n![wechat group](doc/images/wechat.JPG)\n\n## Contributing\n\nIf you wish to contribute a change to any of the existing plugins in this repo, please review our [contribution](CONTRIBUTING.md) guide and open a pull request.\n\n## License\n\ng_faraday is released under the MIT license. [See LICENSE](LICENSE) for details.\n"
  },
  {
    "path": "README_EN.md",
    "content": "# ![log](./doc/images/logo.png)  Faraday [中文文档](./README.md)\n\n![Build](https://img.shields.io/github/workflow/status/gfaraday/g_faraday/Publisher/master?logo=github&style=for-the-badge)\n![pub_Version](https://img.shields.io/pub/v/g_faraday?include_prereleases&style=for-the-badge&logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjAwcHgiIGhlaWdodD0iNjAwcHgiIHZpZXdCb3g9IjAgMCA2MDAgNjAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPmZhcmFkYXk8L3RpdGxlPgogICAgPGRlZnM+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IHgxPSIxMC42ODAxNzA0JSIgeTE9IjI2Ljk5MzAyODclIiB4Mj0iNzIuMTEzMDU3NiUiIHkyPSI1Mi45MTkyNjU3JSIgaWQ9ImxpbmVhckdyYWRpZW50LTEiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDAwMDAwIiBvZmZzZXQ9IjAlIj48L3N0b3A+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMCIgb2Zmc2V0PSIxMDAlIj48L3N0b3A+CiAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSJmYXJhZGF5IiBmaWxsLXJ1bGU9Im5vbnplcm8iPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPgogICAgICAgICAgICAgICAgPGcgaWQ9ImZsdXR0ZXItc2Vla2xvZ28uY29tIj4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgZmlsbD0iI0VCRkNGNCIgcG9pbnRzPSIyMDQuNTY2ODQ1IDAgMCAyMjEuOTI4NzQ2IDYzLjMxNzM1OSAyOTAuNjE5OTQ2IDMzMS4yMDI5ODkgMCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBmaWxsPSIjRUJGQ0Y0IiBwb2ludHM9IjIwMy4zNDU5MzggMjA0LjI0MTI0IDkzLjk5MDAzNzQgMzIyLjYyMDg5OSAxNTcuNDQzOTAxIDM5Mi4zMzY5MjcgMjIwLjU0MzM2OCAzMjQuMDMwNjU4IDMzMS4yMDI5ODkgMjA0LjI0MTI0Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGw9IiNFQkZDRjQiIHBvaW50cz0iMTU3LjM5NjAxNSAzOTIuODE5ODQxIDIwNS40NDUxNzMgNDQ0LjgwOTk3MyAzMzEuMjAyOTg5IDQ0NC44MDk5NzMgMjIwLjUxMTk2NSAzMjQuNTI1NjA2Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGw9IiNFQkZDRjQiIHBvaW50cz0iOTMuMjQ0MDg0NyAzMjMuODY0MiAxNTYuNjA3OTA4IDI1NS4wOTk3MyAyMjAuODAxOTkzIDMyNC41MDgyMzIgMTU3LjU1ODAwMSAzOTMuMTQ0MjA1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIGZpbGwtb3BhY2l0eT0iMC44IiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50LTEpIiBwb2ludHM9IjE1Ny4zOTYwMTUgMzkyLjMzNjkyNyAyMTAuMzIyOTA0IDM3My4zMzA1NzYgMjE1LjU4MDMyNCAzMjkuMzY5MjcyIj48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iZmx1dHRlci1zZWVrbG9nby5jb20iIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Ny43OTcwMTEsIDE1NC4xOTAwMjcpIiBmaWxsPSIjRUJGQ0Y0Ij4KICAgICAgICAgICAgICAgICAgICA8cG9seWdvbiBpZD0iUGF0aCIgcG9pbnRzPSIyMDQuNTY2ODQ1IDAgMCAyMjEuOTI4NzQ2IDYzLjMxNzM1OSAyOTAuNjE5OTQ2IDMzMS4yMDI5ODkgMCI+PC9wb2x5Z29uPgogICAgICAgICAgICAgICAgICAgIDxwb2x5Z29uIGlkPSJQYXRoIiBwb2ludHM9IjIwMy4zNDU5MzggMjA0LjI0MTI0IDkzLjk5MDAzNzQgMzIyLjYyMDg5OSAxNTcuNDQzOTAxIDM5Mi4zMzY5MjcgMjIwLjU0MzM2OCAzMjQuMDMwNjU4IDMzMS4yMDI5ODkgMjA0LjI0MTI0Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIHBvaW50cz0iMTU3LjM5NjAxNSAzOTIuODE5ODQxIDIwNS40NDUxNzMgNDQ0LjgwOTk3MyAzMzEuMjAyOTg5IDQ0NC44MDk5NzMgMjIwLjUxMTk2NSAzMjQuNTI1NjA2Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICAgICAgPHBvbHlnb24gaWQ9IlBhdGgiIHBvaW50cz0iOTMuMjQ0MDg0NyAzMjMuODY0MiAxNTYuNjA3OTA4IDI1NS4wOTk3MyAyMjAuODAxOTkzIDMyNC41MDgyMzIgMTU3LjU1ODAwMSAzOTMuMTQ0MjA1Ij48L3BvbHlnb24+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICA8L2c+Cjwvc3ZnPg==)\n![Flutter_Version](https://img.shields.io/badge/Flutter-1.24.0--10.2.pre-blue?style=for-the-badge&logo=flutter)\n![License](https://img.shields.io/github/license/gfaraday/g_faraday?style=for-the-badge)\n\nFlutter plugin for integrate flutter to existing app\n\n## Features\n\n- [x] `ios`、`android`、`flutter` Native route apis\n- [x] Hybrid stack(native -> flutter -> native)\n- [x] Initial Page Support\n- [x] ChildViewController、Fragment Support\n- [x] Alert Page Support\n- [x] [CallBack](doc/callback.md)\n- [x] [iOS NavigationBar Auto hide/show](doc/ios_navigation_bar.md)\n- [x] WillPopScope Handle `onBackPress`\n- [x] [Global Notification](doc/notification.md)\n- [x] Custom Page Transition\n- [ ] Unit Test\n- [ ] Complete Documentation(7/10)\n\n## Show Cases\n\n![demo](doc/images/demo_en.png)\n\n## Example App\n\n[Android Download apk](https://github.com/gfaraday/g_faraday/releases/download/v0.5.0-nullsafety.3/appv2.apk)\n\n<!-- [iOS下载app](https://github.com/gfaraday/g_faraday/releases/download/0.4.2/example.app.zip)\n> [模拟器安装app](doc/ios-simulator-install.md) -->\n\n## Design Principles\n\n- avoid dependency platform implementation\n- avoid modify existing code\n- follow platform api design guidance\n\n## Requirements\n\n- Flutter 2.5.0 • channel stable\n- iOS 10.0+ Xcode 12.0+ Swift 5.1+\n- Android minSdkVersion 16 Kotlin 1.4.10+\n\n## Faraday VS. Flutter versions\n\n| g_faraday           | flutter                                                                   | cocoapods | remark        |\n| ------------------- | ------------------------------------------------------------------------- | --------- | ------------- |\n| ^0.7.2              | Flutter 2.5.0 • channel stable • `https://github.com/flutter/flutter.git` | any       | recommend     |\n| ^0.7.0              | Flutter 2.0.0 • channel stable                                            | any       | not recommend |\n| ^0.5.1-nullsafety.0 | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n| ^0.5.0-nullsafety.0 | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n| ^4.0.0              | Flutter 1.24.0-10.2.pre • channel beta                                    | any       | not recommend |\n\n## Quick Start\n\n[Browse Example Source Code](example/)\n\n### add dependencies\n\n``` yaml\ndependencies:\n  # please confirm flutter channel >> supported: flutter channel beta, 1.25.0-8.1.pre\n  g_faraday: ^0.5.1-nullsafety.0\n```\n\n### Flutter\n\nRegister route which will be open from native.\n\n``` dart\n\n// 0x00 define route\nfinal route = faraday.wrapper((settings) {\n    switch (settings.name) {\n    case 'first_page':\n        return CupertinoPageRoute(builder: (context) => Text('First Page'));\n    case 'second_page':\n        return CupertinoPageRoute(builder: (context) => Text('Second Page'));\n    }\n    return CupertinoPageRoute(builder: (context) => Text(settings.name));\n});\n\n// 0x01 set route to your `App` widget\nCupertinoApp(onGenerateRoute: (_) => route);\n\n```\n\n### iOS\n\nProvider a navigator to open `flutter` page.\n\n``` swift\n\n// 0x00 implement `FaradayNavigationDelegate`\nextension AppDelegate: FaradayNavigationDelegate {\n\n    func push(_ name: String, arguments: Any?, options: [String : Any]?, callback token: CallbackToken) {\n\n        let isFlutter = options?[\"flutter\"] as? Bool ?? false\n        let isPresent = options?[\"present\"] as? Bool ?? false\n\n        let vc = isFlutter ? FaradayFlutterViewController(name, arguments: arguments) : FirstViewController(name， arguments: arguments)\n\n        let topMost = UIViewController.fa.topMost\n        if (isPresent) {\n            topMost?.present(vc, animated: true, completion: nil)\n        } else {\n            topMost?.navigationController?.pushViewController(vc, animated: true)\n        }\n\n        // IMPORTANT\n        vc.fa.enableCallback(with: token)\n    }\n}\n\n// 0x01 start flutter Engine in `application: didFinishLaunchingWithOptions`\nFaraday.default.startFlutterEngine(navigatorDelegate: self)\n\n\n// 0x02 open flutter page\nlet vc = FaradayFlutterViewController(\"first_page\", arguments: nil)\nnavigationController?.pushViewController(vc, animated: true)\n\n```\n\n### Android\n\nProvider a navigator to open `flutter` page.\n\n``` kotlin\n\n// 0x00 implement `FaradayNavigator`\nclass SimpleFlutterNavigator : FaradayNavigator {\n\n    companion object {\n        const val KEY_ARGS = \"_args\"\n    }\n\n    override fun create(name: String, arguments: Serializable?, options: HashMap<String, *>?): Intent? {\n        val context = Faraday.getCurrentActivity() ?: return null\n\n        val isFlutterRoute = options?.get(\"flutter\") == true\n\n        if (isFlutterRoute) {\n            // singleTask mode\n            val builder = FaradayActivity.builder(name, arguments)\n\n            builder.backgroundColor = Color.WHITE\n            builder.activityClass = SingleTaskFlutterActivity::class.java\n\n            return builder.build(context);\n        }\n\n        when (name) {\n            \"flutter2native\" -> {\n                return Intent(context, FlutterToNativeActivity::class.java)\n            }\n            \"native2flutter\" -> {\n                return Intent(context, Native2FlutterActivity::class.java)\n            }\n            \"tabContainer\" -> {\n                return Intent(context, TabContainerActivity::class.java)\n            }\n            else -> {\n                val intent = Intent(Intent.ACTION_VIEW)\n                intent.data = Uri.parse(name)\n                intent.putExtra(KEY_ARGS, arguments)\n                return intent\n            }\n        }\n\n    }\n\n    override fun pop(result: Serializable?) {\n        val activity = Faraday.getCurrentActivity() ?: return\n        if (result != null) {\n            activity.setResult(Activity.RESULT_OK, Intent().apply { putExtra(KEY_ARGS, result) })\n        }\n        activity.finish()\n    }\n\n    override fun enableSwipeBack(enable: Boolean) {\n\n    }\n\n}\n\n// 0x01 start flutter engine in Application.onCrate\nif (!Faraday.startFlutterEngine(this, SimpleFlutterNavigator())) {\n    GeneratedPluginRegistrant.registerWith(Faraday.engine)\n}\n\n// 0x02 open flutter page\nval intent = FaradayActivity.build(context, routeName, params)\ncontext.startActivity(intent)\n\n```\n\n## faraday tools (Recommend)\n\n- [Route](doc/route.md)\n- [Bridge Native Methods](doc/bridge.md)\n- [Net](doc/net.md)\n- [JSON](doc/json.md)\n- [vscode Extension](https://github.com/gfaraday/faraday_extension)\n\n## FAQ\n\n## Communication\n\n## Contributing\n\nIf you wish to contribute a change to any of the existing plugins in this repo, please review our [contribution](CONTRIBUTING.md) guide and open a pull request.\n\n## License\n\ng_faraday is released under the MIT license. [See LICENSE](LICENSE) for details.\n"
  },
  {
    "path": "analysis_options.yaml",
    "content": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n# The issues identified by the analyzer are surfaced in the UI of Dart-enabled\n# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be\n# invoked from the command line by running `flutter analyze`.\n\n# The following line activates a set of recommended lints for Flutter apps,\n# packages, and plugins designed to encourage good coding practices.\ninclude: package:flutter_lints/flutter.yaml\n\nlinter:\n  # The lint rules applied to this project can be customized in the\n  # section below to disable rules from the `package:flutter_lints/flutter.yaml`\n  # included above or to enable additional rules. A list of all available lints\n  # and their documentation is published at\n  # https://dart-lang.github.io/linter/lints/index.html.\n  #\n  # Instead of disabling a lint rule for the entire project in the\n  # section below, it can also be suppressed for a single line of code\n  # or a specific dart file by using the `// ignore: name_of_lint` and\n  # `// ignore_for_file: name_of_lint` syntax on the line or in the file\n  # producing the lint.\n  rules:\n    # avoid_print: false  # Uncomment to disable the `avoid_print` rule\n    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule\n\n# Additional information about this file can be found at\n# https://dart.dev/guides/language/analysis-options\n"
  },
  {
    "path": "android/.gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n"
  },
  {
    "path": "android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java",
    "content": "package io.flutter.plugins;\n\nimport io.flutter.plugin.common.PluginRegistry;\nimport com.yuxiaor.flutter.g_faraday.GFaradayPlugin;\n\n/**\n * Generated file. Do not edit.\n */\npublic final class GeneratedPluginRegistrant {\n  public static void registerWith(PluginRegistry registry) {\n    if (alreadyRegisteredWith(registry)) {\n      return;\n    }\n    GFaradayPlugin.registerWith(registry.registrarFor(\"com.yuxiaor.flutter.g_faraday.GFaradayPlugin\"));\n  }\n\n  private static boolean alreadyRegisteredWith(PluginRegistry registry) {\n    final String key = GeneratedPluginRegistrant.class.getCanonicalName();\n    if (registry.hasPlugin(key)) {\n      return true;\n    }\n    registry.registrarFor(key);\n    return false;\n  }\n}\n"
  },
  {
    "path": "android/build.gradle",
    "content": "group 'com.yuxiaor.flutter.g_faraday'\nversion '1.0-SNAPSHOT'\n\nbuildscript {\n    ext.kotlin_version = '1.6.21'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependencies {\n        //noinspection GradleDependency\n        classpath 'com.android.tools.build:gradle:3.5.4'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nrootProject.allprojects {\n    repositories {\n        google()\n    }\n}\n\napply plugin: 'com.android.library'\napply plugin: 'kotlin-android'\n\nandroid {\n    compileSdkVersion 33\n//    buildToolsVersion \"29.0.3\"\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n    defaultConfig {\n        minSdkVersion 16\n    }\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'\n    implementation \"androidx.activity:activity-ktx:1.6.0-alpha05\"\n}\n"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-5.6.2-all.zip\n"
  },
  {
    "path": "android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "android/settings.gradle",
    "content": "rootProject.name = 'g_faraday'\n"
  },
  {
    "path": "android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.yuxiaor.flutter.g_faraday\">\n\n    <application tools:node=\"merge\">\n\n        <activity\n            android:name=\".FaradayActivity\"\n            android:configChanges=\"orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode\"\n            android:hardwareAccelerated=\"true\"\n            android:windowSoftInputMode=\"adjustResize\" />\n\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n\n    </application>\n</manifest>\n"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/Faraday.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.yuxiaor.flutter.g_faraday.channels.*\nimport com.yuxiaor.flutter.g_faraday.channels.CommonChannel\nimport com.yuxiaor.flutter.g_faraday.channels.NetChannel\nimport io.flutter.FlutterInjector\nimport io.flutter.embedding.android.FlutterFragment\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint\nimport io.flutter.plugin.common.MethodChannel\nimport java.lang.ref.WeakReference\nimport java.util.concurrent.atomic.AtomicInteger\n\ninterface FaradayContainer {\n\n    // detach from engine\n    fun performDetach()\n\n    //\n    fun rebuildFlutterPage()\n}\n\n/**\n * Author: Edward\n * Date: 2020-08-31\n * Description:\n */\nobject Faraday {\n\n    lateinit var engine: FlutterEngine\n        private set\n\n    private val nextCode = AtomicInteger()\n\n    // router manager\n    internal lateinit var navigator: FaradayNavigator\n\n    /**\n     *  init engine\n     *\n     *  @param context Application Context\n     *  @param navigator handle native route\n     *  @param netHandler handle net request\n     *  @param commonHandler common method invoke\n     *  @param automaticallyRegisterPlugins If plugins are automatically\n     * registered, then they are registered during the execution of this constructor\n     *\n     *  @return true if plugins registered otherwise return false.\n     *\n     *  @sample\n     *  if (!Faraday.startFlutterEngine(this, MyFlutterNavigator())) {\n     *       GeneratedPluginRegister.registerGeneratedPlugins(Faraday.engine)\n     *   }\n     *\n     */\n    @JvmStatic\n    fun startFlutterEngine(context: Context,\n                           navigator: FaradayNavigator,\n                           netHandler: NetHandler? = null,\n                           commonHandler: MethodChannel.MethodCallHandler? = null,\n                           automaticallyRegisterPlugins: Boolean = true,\n                           dartEntrypointFunctionName: String = \"main\"): Boolean {\n        // 这个navigator 必须先初始化 不能动\n        this.navigator = navigator\n\n        engine = FlutterEngine(context, arrayOf(), automaticallyRegisterPlugins)\n\n        val flutterLoader = FlutterInjector.instance().flutterLoader()\n\n        if (!flutterLoader.initialized()) {\n            throw AssertionError(\n                    \"DartEntrypoints can only be created once a FlutterEngine is created.\")\n        }\n        val entrypoint = DartEntrypoint(flutterLoader.findAppBundlePath(), dartEntrypointFunctionName)\n\n        engine.dartExecutor.executeDartEntrypoint(entrypoint)\n\n        if (netHandler != null) {\n            NetChannel(engine.dartExecutor, netHandler)\n        }\n\n        if (commonHandler != null) {\n            CommonChannel(engine.dartExecutor, commonHandler)\n        }\n\n        FaradayNotice.setup(engine.dartExecutor)\n\n        return  false\n    }\n\n    internal fun genPageId(): Int {\n        return nextCode.getAndIncrement()\n    }\n\n    /**\n     * The current flutter container Activity\n     */\n    @JvmStatic\n    fun getCurrentContainer(): FaradayContainer? {\n        val activity = getCurrentActivity()\n        if (activity is FaradayContainer) {\n            return activity\n        }\n\n        if (activity is FragmentActivity) {\n            var frag = activity.supportFragmentManager.fragments.find { it.isVisible }\n            if (frag == null) {\n                frag = activity.supportFragmentManager.fragments.find { it is FaradayContainer }\n            }\n            if (frag is FaradayContainer) {\n                return frag\n            }\n        }\n\n        return  null\n    }\n\n    fun getCurrentActivity(): Activity? {\n        return  engine.gFaradayPlugin()?.binding?.activity\n    }\n    /**\n     * start native Activity,and request for Activity result\n     */\n    internal fun startNativeForResult(intent: Intent, callback: (result: HashMap<String, Any?>?) -> Unit) {\n        val code = nextCode.getAndIncrement()\n        startNativeForResult(intent, code) { requestCode, resultCode, data ->\n            if (requestCode == code) {\n                if (resultCode == Activity.RESULT_OK) {\n                    val map = hashMapOf<String, Any?>()\n                    data?.extras?.keySet()?.forEach {\n                        map[it] = data.extras?.get(it)\n                    }\n                    callback.invoke(map)\n                } else {\n                    callback.invoke(null)\n                }\n            }\n        }\n    }\n\n    private fun startNativeForResult(intent: Intent, requestCode: Int, callback: ResultListener) {\n        val activity = getCurrentContainer()\n\n        if (activity is ResultProvider) {\n            activity.addResultListener(callback)\n            if (activity is Activity) {\n                activity.startScheme(intent, requestCode)\n            }\n            return\n        }\n\n        if (activity is FragmentActivity) {\n            val frag = activity.supportFragmentManager.fragments.first { it.isVisible }\n            if (frag is ResultProvider) {\n                frag.addResultListener(callback)\n                frag.startScheme(intent, requestCode)\n            }\n        }\n    }\n\n    private fun Activity.startScheme(intent: Intent, requestCode: Int){\n        try {\n            startActivityForResult(intent, requestCode)\n        }catch (e:Exception){\n            Log.e(\"Faraday\", \"Route Not Found: '${intent.data}'\")\n        }\n    }\n\n    private fun Fragment.startScheme(intent: Intent, requestCode: Int){\n        try {\n            startActivityForResult(intent, requestCode)\n        }catch (e:Exception){\n            Log.e(\"Faraday\", \"Route Not Found: '${intent.data}'\")\n        }\n    }\n}\n"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/FaradayActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Color\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.PersistableBundle\nimport android.util.Log\nimport android.view.View\nimport android.view.ViewGroup\nimport com.yuxiaor.flutter.g_faraday.channels.CommonChannel\nimport com.yuxiaor.flutter.g_faraday.channels.FaradayNotice\nimport com.yuxiaor.flutter.g_faraday.channels.NetChannel\nimport io.flutter.embedding.android.ExclusiveAppComponent\nimport io.flutter.embedding.android.FlutterActivity\nimport io.flutter.embedding.android.FlutterActivityLaunchConfigs.BackgroundMode\nimport io.flutter.embedding.android.FlutterView\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugin.platform.PlatformPlugin\nimport java.io.Serializable\nimport java.lang.ref.WeakReference\n\n\nfun View.flutterView(): FlutterView? {\n    if (this is FlutterView) {\n        return this\n    }\n    if (this is ViewGroup) {\n        for (i in 0..childCount) {\n            val child = getChildAt(i)\n            val fv = child.flutterView()\n            if (fv != null) {\n                return fv\n            }\n        }\n    }\n    return  null\n}\n/**\n * Author: Edward\n * Date: 2020-09-01\n * Description:\n */\nopen class FaradayActivity : FlutterActivity(), ResultProvider, ExclusiveAppComponent<Activity>, FaradayContainer {\n\n    companion object {\n\n\n        private const val TAG = \"FaradayActivity\"\n\n        fun builder(routeName: String, params: Serializable? = null, opaque: Boolean = true) = builder<FaradayActivity>(routeName, params, opaque)\n\n        // opaque: Boolean = false 效率会差一些\n        // 除非你有 非常非常非常 明确的理由，否则不要动他\n        //\n        //\n        // 目前只有一种特定情况 opaque 需要设置为false\n        //\n        // 假如有一个`FaradayActivity`(假设为A)会使用新的容器打开flutter页面(假设为B)\n        // 那么在 build A activity 的intent时 需要设置 `opaque = false` 否则在跳转时 页面会闪烁\n        //\n        inline fun <reified T : FaradayActivity> builder(\n            routeName: String,\n            params: Serializable? = null,\n            opaque: Boolean = false,\n            backgroundColor: Int? = null,\n        ) = SingleEngineIntentBuilder(routeName, params, T::class.java, opaque, backgroundColor)\n    }\n\n    // 后续考虑支持更多参数, 然后再放开访问权限\n    data class SingleEngineIntentBuilder(val routeName: String,\n                                         val params: Serializable?,\n                                         var activityClass: Class<out FaradayActivity>,\n                                         var opaque: Boolean,\n                                         var backgroundColor: Int?) {\n\n        // 真正开始Build的时候再生成id\n        fun build(context: Context): Intent {\n\n            val bm = (if (opaque) BackgroundMode.opaque else BackgroundMode.transparent).name\n\n            val pageId = Faraday.genPageId()\n\n            return Intent(context, activityClass).apply {\n                putExtra(FaradayConstants.ID, pageId)\n                putExtra(FaradayConstants.ARGS, params)\n                putExtra(FaradayConstants.ROUTE, routeName)\n                putExtra(FaradayConstants.SPLASH_SCREEN_BACKGROUND_COLOR, backgroundColor)\n                putExtra(FaradayConstants.BACKGROUND_MODE, bm)\n            }\n        }\n\n    }\n\n    private val pageId: Int\n        get() = intent.getIntExtra(FaradayConstants.ID, 0)\n\n    private val routeName: String\n        get() = intent.getStringExtra(FaradayConstants.ROUTE) ?: \"\"\n\n    private val params: Serializable?\n        get() = intent.getSerializableExtra(FaradayConstants.ARGS);\n\n    private val backgroundModeName: String\n        get() = intent.getStringExtra(FaradayConstants.BACKGROUND_MODE)?: BackgroundMode.opaque.name\n\n    private var resultListener: ResultListener? = null\n\n    private var isAttached = false\n    private var platformPlugin: PlatformPlugin? = null\n    private val gFaradayPlugin: GFaradayPlugin?\n        get() = Faraday.engine.gFaradayPlugin()\n    private var flutterViewRef = WeakReference<FlutterView?>(null)\n\n    override fun onNewIntent(intent: Intent) {\n        // 只有在intent 发生实质性变化时才考虑更新flutter页面\n        if (intent.getIntExtra(FaradayConstants.ID, -1) != -1) {\n            this.intent = intent\n        }\n        super.onNewIntent(this.intent)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n\n        if (Faraday.getCurrentActivity() != this) {\n            Faraday.getCurrentContainer()?.performDetach()\n        }\n\n        super.onCreate(savedInstanceState)\n\n        flutterViewRef = WeakReference(window.decorView.flutterView())\n\n        //\n        // dart 侧创建页面\n        gFaradayPlugin?.onPageCreate(routeName, params, pageId, backgroundModeName)\n\n        Log.d(TAG, \"onCreate: $this\")\n    }\n\n    override fun detachFromFlutterEngine() {\n        // 如果不重写这个方法，delegate会被释放掉\n    }\n\n    override fun shouldDestroyEngineWithHost(): Boolean {\n        return false\n    }\n\n    override fun providePlatformPlugin(\n        activity: Activity?,\n        flutterEngine: FlutterEngine\n    ): PlatformPlugin? {\n        // 自己托管 platformPlugin\n        return null\n    }\n\n    override fun shouldAttachEngineToActivity(): Boolean {\n        // 自己管理\n        return false;\n    }\n\n    override fun shouldDispatchAppLifecycleState(): Boolean {\n        return false;\n    }\n\n    override fun rebuildFlutterPage() {\n        gFaradayPlugin?.onPageCreate(routeName, params, pageId, backgroundModeName)\n        gFaradayPlugin?.onPageShow(pageId)\n    }\n\n    override fun provideFlutterEngine(context: Context): FlutterEngine? {\n        return Faraday.engine\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        if (Faraday.getCurrentActivity() != this) {\n            Faraday.getCurrentContainer()?.performDetach()\n        }\n\n        performAttach()\n\n        //\n        flutterEngine?.lifecycleChannel?.appIsResumed()\n\n        //\n        gFaradayPlugin?.onPageShow(pageId)\n\n        //\n        platformPlugin?.updateSystemUiOverlays()\n    }\n\n    override fun onDestroy() {\n        gFaradayPlugin?.onPageDealloc(pageId)\n        performDetach()\n        super.onDestroy()\n    }\n\n//    override fun provideSplashScreen(): SplashScreen? {\n//        val splashScreen = super.provideSplashScreen()\n//        if (splashScreen != null) return splashScreen\n//        return FaradayColorBaseSplashScreen(intent?.getIntExtra(FaradayConstants.SPLASH_SCREEN_BACKGROUND_COLOR, Color.WHITE))\n//    }\n\n    override fun addResultListener(resultListener: ResultListener) {\n        this.resultListener = resultListener\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        resultListener?.invoke(requestCode, resultCode, data)\n        resultListener = null\n    }\n\n    override fun getAppComponent(): Activity {\n        return super.getExclusiveAppComponent().appComponent\n    }\n\n    private fun performAttach() {\n        Log.d(TAG, \"attach: $this\")\n        if (!isAttached) {\n            assert(flutterEngine != null)\n            assert(flutterViewRef.get() != null)\n\n            // 0x01\n            flutterEngine?.activityControlSurface?.attachToActivity(this, lifecycle)\n\n            flutterViewRef = WeakReference(window.decorView.flutterView())\n\n            // 0x02\n            if (platformPlugin == null) {\n                platformPlugin = PlatformPlugin(activity, flutterEngine!!.platformChannel, this)\n            }\n\n            // 0x03\n            flutterViewRef.get()?.attachToFlutterEngine(flutterEngine!!)\n\n            //\n            isAttached = true\n        }\n    }\n\n    override fun performDetach() {\n        Log.d(TAG, \"detach: $this\")\n        if (isAttached) {\n\n            // 0x01\n            assert(flutterEngine != null)\n\n            //\n            platformPlugin?.destroy()\n            platformPlugin = null\n\n            if (Faraday.getCurrentActivity() == this) {\n                //\n                flutterEngine?.activityControlSurface?.detachFromActivity()\n\n                //\n                flutterViewRef.get()?.detachFromFlutterEngine()\n\n            }\n\n            isAttached = false\n        }\n    }\n}\n"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/FaradayColorBaseSplashScreen.kt",
    "content": "//package com.yuxiaor.flutter.g_faraday\n//\n//import android.animation.Animator\n//import android.animation.Animator.AnimatorListener\n//import android.content.Context\n//import android.graphics.Color\n//import android.os.Bundle\n//import android.view.View\n//import io.flutter.embedding.android.SplashScreen\n//\n//class FaradayColorBaseSplashScreen(private val color: Int?) : SplashScreen {\n//\n//    private var splashView: View? = null\n//\n//    override fun createSplashView(context: Context, savedInstanceState: Bundle?): View? {\n//        //不能重用\n//        // if (splashView != null) {\n//        //     return splashView\n//        // }\n//        splashView = View(context)\n//        splashView?.setBackgroundColor(color ?: Color.WHITE)\n//        return splashView\n//    }\n//\n//    override fun transitionToFlutter(onTransitionComplete: Runnable) {\n//        if (splashView == null) {\n//            onTransitionComplete.run()\n//            return\n//        }\n//        splashView!!\n//                .animate()\n//                .alpha(0.0f)\n//                .setDuration(500)\n//                .setListener(\n//                        object : AnimatorListener {\n//                            override fun onAnimationStart(animation: Animator) {}\n//                            override fun onAnimationEnd(animation: Animator) {\n//                                onTransitionComplete.run()\n//                            }\n//\n//                            override fun onAnimationCancel(animation: Animator) {\n//                                onTransitionComplete.run()\n//                            }\n//\n//                            override fun onAnimationRepeat(animation: Animator) {}\n//                        })\n//    }\n//}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/FaradayConstants.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nclass FaradayConstants {\n\n    companion object {\n        //TODO: 这些key的定义，需要重构\n        const val ID = \"_flutter_id\"\n        const val ARGS = \"_flutter_args\"\n        const val ROUTE = \"_flutter_route\"\n\n        // 注意这个key 不能修改， flutter 内部有使用\n        const val BACKGROUND_MODE = \"background_mode\"\n\n        const val SPLASH_SCREEN_BACKGROUND_COLOR = \"_flutter_splash_screen_background_color\"\n    }\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/FaradayFragment.kt",
    "content": "\n\npackage com.yuxiaor.flutter.g_faraday\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport io.flutter.embedding.android.*\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.plugin.platform.PlatformPlugin\nimport java.io.Serializable\nimport java.lang.ref.WeakReference\n\n\n/**\n * Author: Edward\n * Date: 2020-09-07\n * Description:\n */\nclass FaradayFragment : FlutterFragment(), ResultProvider, FaradayContainer, ExclusiveAppComponent<Activity> {\n\n    private val pageId by lazy { arguments?.getInt(FaradayConstants.ID) ?: 0 }\n    private val routeName by lazy { arguments?.getString(FaradayConstants.ROUTE) ?: \"/\" }\n    private val args by lazy { arguments?.get(FaradayConstants.ARGS) }\n    private val backgroundModeName by lazy {\n       arguments?.getString(FaradayConstants.BACKGROUND_MODE) ?: FlutterActivityLaunchConfigs.BackgroundMode.opaque.name }\n\n    private var resultListener: ResultListener? = null\n\n    private val gFaradayPlugin: GFaradayPlugin?\n        get() = Faraday.engine.gFaradayPlugin()\n    private var flutterViewRef = WeakReference<FlutterView?>(null)\n\n    private var isAttached = false\n    private var platformPlugin: PlatformPlugin? = null\n\n    companion object {\n\n        const val TAG = \"FaradayFragment\"\n        ///\n        /// 1. 注意 fragment 有一个小限制，如果打算使用\n        /// FragmentTransaction.add 然后 show/hide 的方式来切换 fragment 那么opaque必须为false\n        ///\n        /// ❌否则在动画过程中会出现 白屏/黑屏❌\n        ///\n        @JvmStatic\n        fun newInstance(\n                routeName: String,\n                params: HashMap<String, Any>? = null,\n                opaque: Boolean = true,\n                backgroundColor: Int? = null,\n        ): FaradayFragment {\n            val pageId = Faraday.genPageId()\n            val bm = (if (opaque) TransparencyMode.opaque else TransparencyMode.transparent).name\n            val bundle = Bundle().apply {\n                putInt(FaradayConstants.ID, pageId)\n                putString(FaradayConstants.ROUTE, routeName)\n                putSerializable(FaradayConstants.ARGS, params)\n                putString(ARG_FLUTTERVIEW_TRANSPARENCY_MODE, bm)\n                if (backgroundColor != null) {\n                    putInt(FaradayConstants.SPLASH_SCREEN_BACKGROUND_COLOR, backgroundColor)\n                }\n            }\n            return FaradayFragment().apply { arguments = bundle }\n        }\n    }\n\n    override fun detachFromFlutterEngine() {\n        //\n    }\n\n    override fun providePlatformPlugin(\n        activity: Activity?,\n        flutterEngine: FlutterEngine\n    ): PlatformPlugin? {\n        return null\n    }\n\n    override fun onDestroy() {\n        gFaradayPlugin?.onPageDealloc(pageId)\n        performDetach()\n        super.onDestroy()\n    }\n\n    override fun shouldDestroyEngineWithHost(): Boolean {\n        return false\n    }\n\n    override fun getRenderMode(): RenderMode {\n        return RenderMode.texture\n    }\n\n    override fun getTransparencyMode(): TransparencyMode {\n        return TransparencyMode.transparent\n    }\n\n//    override fun provideSplashScreen(): SplashScreen? {\n//        val splashScreen = super.provideSplashScreen()\n//        if (splashScreen != null) return splashScreen\n//        return FaradayColorBaseSplashScreen(arguments?.getInt(FaradayConstants.SPLASH_SCREEN_BACKGROUND_COLOR, Color.WHITE))\n//    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        val view = super.onCreateView(inflater, container, savedInstanceState)\n\n        flutterViewRef = WeakReference(view?.flutterView())\n        flutterViewRef.get()?.detachFromFlutterEngine()\n\n        return view\n    }\n\n    override fun onStart() {\n        super.onStart()\n        if (!isHidden) {\n            showFragment()\n        }\n    }\n\n    override fun onHiddenChanged(hidden: Boolean) {\n        super.onHiddenChanged(hidden)\n        if (flutterViewRef.get() == null) return\n\n        if (!hidden) {\n            showFragment()\n        }\n    }\n\n    override fun onPause() {\n        super.onPause()\n        flutterEngine?.lifecycleChannel?.appIsResumed()\n    }\n\n    override fun onResume() {\n        super.onResume()\n        if (!isHidden) {\n            showFragment()\n        }\n        flutterEngine?.lifecycleChannel?.appIsResumed()\n    }\n\n    override fun onStop() {\n        super.onStop()\n        flutterEngine?.lifecycleChannel?.appIsResumed()\n    }\n\n    override fun onDetach() {\n        super.onDetach()\n        gFaradayPlugin?.onPageDealloc(pageId)\n    }\n\n    override fun provideFlutterEngine(context: Context): FlutterEngine? {\n        return Faraday.engine\n    }\n\n    override fun shouldAttachEngineToActivity(): Boolean {\n        return false\n    }\n\n    override fun shouldDispatchAppLifecycleState(): Boolean {\n        return false\n    }\n\n    override fun addResultListener(resultListener: ResultListener) {\n        this.resultListener = resultListener\n\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        resultListener?.invoke(requestCode, resultCode, data)\n        resultListener = null\n    }\n\n    private fun showFragment() {\n        if (Faraday.getCurrentContainer() != this) {\n            Faraday.getCurrentContainer()?.performDetach()\n        }\n        performAttach()\n        gFaradayPlugin?.onPageShow(pageId)\n    }\n\n    private fun performAttach() {\n        Log.d(TAG, \"attach: $this\")\n        if (!isAttached) {\n            assert(flutterEngine != null)\n            assert(flutterViewRef.get() != null)\n\n            gFaradayPlugin?.onPageCreate(routeName, args as? Serializable, pageId, backgroundModeName)\n\n            // 0x01\n            flutterEngine?.activityControlSurface?.attachToActivity(this, lifecycle)\n\n            // 0x02\n            if (platformPlugin == null) {\n                platformPlugin = PlatformPlugin(requireActivity(), flutterEngine!!.platformChannel, this)\n            }\n\n            // 0x03\n            flutterViewRef.get()?.attachToFlutterEngine(flutterEngine!!)\n\n            //\n            isAttached = true\n        }\n    }\n\n    override fun performDetach() {\n        Log.d(TAG, \"detach: $this\")\n        if (isAttached) {\n\n            // 0x01\n            assert(flutterEngine != null)\n\n            //\n            platformPlugin?.destroy()\n            platformPlugin = null\n\n            if (Faraday.getCurrentContainer() == this) {\n                //\n                flutterEngine?.activityControlSurface?.detachFromActivity()\n\n                //\n                flutterViewRef.get()?.detachFromFlutterEngine()\n\n            }\n\n            isAttached = false\n        }\n    }\n\n    override fun rebuildFlutterPage() {\n        gFaradayPlugin?.onPageCreate(routeName, args as? Serializable, pageId, backgroundModeName)\n        gFaradayPlugin?.onPageShow(pageId)\n    }\n\n    override fun getAppComponent(): Activity {\n       return requireActivity()\n    }\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/FaradayNavigator.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nimport android.content.Intent\nimport java.io.Serializable\n\n/**\n * Author: Edward\n * Date: 2020-09-02\n * Description:\n */\n\ndata class Options(val raw: HashMap<String, *>?) {\n\n    val animated: Boolean\n        get() = get(\"_faraday.animated\", true)\n\n    val present: Boolean\n        get() = get(\"_faraday.present\", false)\n\n    val isFlutterRoute: Boolean\n        get() = get(\"_faraday.flutter\", false)\n\n    inline fun <reified T> get(key: String, defaultValue: T): T {\n        if (raw == null) return defaultValue\n        val value = raw[key]\n        if (value is T) return value;\n        return defaultValue\n    }\n}\n\ninterface FaradayNavigator {\n\n    /**\n     * create native Intent\n     */\n    fun create(name: String, arguments: Serializable?, options: Options): Intent?\n\n    /**\n     * finish flutter container Activity\n     */\n    fun pop(result: Serializable?)\n\n    /**\n     * 是否允许滑动返回\n     */\n    fun enableSwipeBack(enable: Boolean)\n}\n"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/GFaradayPlugin.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nimport android.util.Log\nimport androidx.annotation.NonNull\nimport androidx.fragment.app.FragmentActivity\nimport io.flutter.embedding.engine.FlutterEngine\nimport io.flutter.embedding.engine.plugins.FlutterPlugin\nimport io.flutter.embedding.engine.plugins.activity.ActivityAware\nimport io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding\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 java.io.Serializable\nimport java.lang.ref.WeakReference\n\nfun FlutterEngine.gFaradayPlugin(): GFaradayPlugin? {\n    return plugins.get(GFaradayPlugin::class.java) as? GFaradayPlugin\n}\n\n/** GFaradayPlugin */\nclass GFaradayPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {\n\n    companion object {\n        private const val TAG = \"GFaradayPlugin\"\n    }\n\n    private lateinit var channel: MethodChannel\n\n    private val navigator: FaradayNavigator\n        get() = Faraday.navigator\n\n    internal var binding: ActivityPluginBinding? = null\n\n    override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {\n        Log.d(TAG, \"onMethodCall: ${call.method}\")\n        //\n        when (call.method) {\n            \"pushNativePage\" -> {\n                val name = call.argument<String>(\"name\")\n                require(name != null) { \"page route name should not be null\" }\n                val arguments = call.argument<Serializable>(\"arguments\")\n                val options = call.argument<HashMap<String, *>>(\"options\")\n                navigator.create(name, arguments, Options(options))?.let {\n                    Faraday.startNativeForResult(it) { nativeResult ->\n                        result.success(nativeResult)\n                    }\n                }\n            }\n            \"popContainer\" -> {\n                val arg = call.arguments\n                navigator.pop(arg as? Serializable)\n                if (arg != null && arg !is Serializable) {\n                    print(\"=========返回值丢失，返回值类型 $arg\")\n                }\n                result.success(null)\n            }\n            \"disableHorizontalSwipePopGesture\" -> {\n                val disable = call.arguments as? Boolean ?: false\n                print(if (!disable) \"enable\" else \"disable\" + \" Horizontal Swipe PopGesture\")\n                navigator.enableSwipeBack(!disable)\n                result.success(null)\n            }\n            \"reCreateLastPage\" -> {\n                Faraday.getCurrentContainer()?.rebuildFlutterPage()\n                result.success(true)\n            }\n            else -> result.notImplemented()\n        }\n    }\n\n    internal fun onPageCreate(route: String, args: Serializable?, id: Int, backgroundMode: String) {\n        val data = hashMapOf<String, Any>()\n        data[\"name\"] = route\n        if (args != null) {\n            data[\"args\"] = args\n        }\n        data[\"id\"] = id\n        data[\"background_mode\"] = backgroundMode\n        channel.invokeMethod(\"pageCreate\", data, object: Result {\n            override fun success(result: Any?) {\n                print(result)\n            }\n\n            override fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) {\n                print(errorMessage)\n            }\n\n            override fun notImplemented() {\n                print(\"notImplemented\")\n            }\n\n        })\n    }\n\n    internal fun onPageShow(seqId: Int) {\n        channel.invokeMethod(\"pageShow\", seqId)\n    }\n\n    internal fun onPageDealloc(seqId: Int) {\n        channel.invokeMethod(\"pageDealloc\", seqId)\n    }\n\n    override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {\n        channel.setMethodCallHandler(null)\n    }\n\n    override fun onAttachedToActivity(binding: ActivityPluginBinding) {\n        this.binding = binding\n    }\n\n    override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {\n        channel = MethodChannel(binding.binaryMessenger, \"g_faraday\")\n        channel.resizeChannelBuffer(2)\n        channel.setMethodCallHandler(this)\n    }\n\n    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {\n    }\n\n    override fun onDetachedFromActivity() {\n        this.binding = null\n    }\n\n    override fun onDetachedFromActivityForConfigChanges() {\n    }\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/ResultProvider.kt",
    "content": "package com.yuxiaor.flutter.g_faraday\n\nimport android.content.Intent\n\n/**\n * Author: Edward\n * Date: 2020-10-22\n * Description:\n */\ntypealias ResultListener = (requestCode: Int, resultCode: Int, data: Intent?) -> Unit\n\ninterface ResultProvider {\n    fun addResultListener(resultListener: ResultListener)\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/channels/CommonChannel.kt",
    "content": "package com.yuxiaor.flutter.g_faraday.channels\n\nimport io.flutter.plugin.common.BinaryMessenger\nimport io.flutter.plugin.common.MethodChannel\n\n/**\n * Author: Edward\n * Date: 2020-09-28\n * Description:桥接通道\n */\ninternal class CommonChannel(messenger: BinaryMessenger, handler: MethodChannel.MethodCallHandler) {\n\n    private val channel by lazy { MethodChannel(messenger, \"g_faraday/common\") }\n\n    init {\n        channel.setMethodCallHandler(handler)\n    }\n\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/channels/NavigatorAnchor.kt",
    "content": "//package com.yuxiaor.flutter.g_faraday.channels\n//\n//import android.app.Activity\n//import android.content.Intent\n//import com.yuxiaor.flutter.g_faraday.Faraday\n//import io.flutter.plugin.common.MethodCall\n//import io.flutter.plugin.common.MethodChannel\n//\n//internal object NavigatorAnchor: MethodChannel.MethodCallHandler {\n//\n//    private val channel = MethodChannel(Faraday.engine.dartExecutor, \"g_faraday/anchor\")\n//\n//    lateinit var anchors: MutableMap<String, Class<Activity>>\n//        private set\n//\n//    init {\n//        channel.setMethodCallHandler(this)\n//    }\n//\n//    fun setup() {\n//        anchors = mutableMapOf()\n//    }\n//\n//    fun popToAnchor(identifier: String) {\n//        channel.invokeMethod(\"popToAnchor\", identifier)\n//    }\n//\n//    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {\n//        when(call.method) {\n//            \"addAnchor\" -> {\n//                val key = call.arguments as String\n//                Faraday.getCurrentActivity()?.let {\n//                    anchors[key] = it.javaClass\n//                }\n//            }\n//            \"removeAnchor\" -> {\n//                val key = call.arguments as String\n//                anchors.remove(key)\n//            }\n//            \"replaceAnchor\" -> {\n//                val args = call.arguments as Map<*, *>\n//                val key = args[\"id\"] as String\n//                val oldKey = args[\"oldID\"] as String\n//                anchors[oldKey]?.let {\n//                    anchors.remove(oldKey)\n//                    anchors[key] = it\n//                }\n//            }\n//            \"popToAnchor\" -> {\n//                val context = Faraday.getCurrentActivity() ?: return\n//                val key = call.arguments as String\n//                val intent = Intent(context, anchors[key])\n//                intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP\n//                context.startActivity(intent)\n//            }\n//        }\n//    }\n//}\n//\n//// 跳转到指定锚点\n//fun Faraday.popToAnchor(identifier: String) {\n//    if (hasAnchor(identifier)) {\n//        NavigatorAnchor.popToAnchor(identifier)\n//    }\n//}\n//\n//// 是否存在某个锚点\n//fun Faraday.hasAnchor(identifier: String): Boolean {\n//    return NavigatorAnchor.anchors.keys.contains(identifier)\n//}\n//\n"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/channels/NetChannel.kt",
    "content": "package com.yuxiaor.flutter.g_faraday.channels\n\nimport io.flutter.plugin.common.BinaryMessenger\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\nimport java.util.*\n\n/**\n * Author: Edward\n * Date: 2020-10-15\n * Description:网络桥接\n */\ninternal class NetChannel(messenger: BinaryMessenger, private val handler: NetHandler) : MethodChannel.MethodCallHandler {\n\n    private val channel = MethodChannel(messenger, \"g_faraday/net\")\n\n    init {\n        channel.setMethodCallHandler(this)\n    }\n\n\n    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {\n        val url = call.argument<String>(\"url\") ?: return\n        val params = call.argument<HashMap<String, Any>>(\"parameters\")\n        val headers = call.argument<HashMap<String, String>>(\"headers\")\n        handler.request(call.method, url, params, headers) {\n            result.success(it)\n        }\n    }\n}\n\n\ninterface NetHandler {\n\n    /**\n     * @param method GET POST PUT DELETE ...\n     * @param url\n     * @param params request params\n     * @param headers request headers\n     * @param onComplete callback the request response\n     */\n    fun request(method: String, url: String, params: HashMap<String, Any>?, headers: HashMap<String, String>?, onComplete: (result: Any?) -> Unit)\n\n}"
  },
  {
    "path": "android/src/main/kotlin/com/yuxiaor/flutter/g_faraday/channels/NoticeChannel.kt",
    "content": "package com.yuxiaor.flutter.g_faraday.channels\n\nimport com.yuxiaor.flutter.g_faraday.Faraday\nimport io.flutter.embedding.engine.dart.DartExecutor\nimport io.flutter.plugin.common.MethodCall\nimport io.flutter.plugin.common.MethodChannel\n\n/**\n * Author: Edward\n * Date: 2020-09-28\n * Description:通知\n */\ninternal object FaradayNotice : MethodChannel.MethodCallHandler {\n\n    private val notifications = hashMapOf<String, NotificationCallback>()\n    private var channel: MethodChannel? = null\n\n    fun setup(dartExecutor: DartExecutor) {\n        channel = MethodChannel(dartExecutor, \"g_faraday/notification\")\n        channel?.setMethodCallHandler(this)\n    }\n\n\n    /**\n     * 发送通知  native -> flutter\n     */\n    fun post(key: String, arguments: Any?) {\n        channel?.invokeMethod(key, arguments)\n    }\n\n    /**\n     * 注册接收通知  flutter -> native\n     */\n    fun register(key: String, callback: (arguments: Any?) -> Unit) {\n        notifications[key] = object : NotificationCallback {\n            override fun onReceiveNotification(arguments: Any?) {\n                callback.invoke(arguments)\n            }\n        }\n    }\n\n    /**\n     * for java\n     */\n    fun register(key: String, callback: NotificationCallback) {\n        notifications[key] = callback\n    }\n\n    /**\n     * 解除注册\n     */\n    fun unregister(key: String) {\n        notifications.remove(key)\n    }\n\n\n    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {\n        val key = call.method\n        val args = call.arguments\n        notifications[key]?.onReceiveNotification(args)\n\n        result.success(notifications.containsKey(key))\n    }\n}\n\n\ninterface NotificationCallback {\n\n    fun onReceiveNotification(arguments: Any?)\n}\n\n\n\n/**\n * post notification  form native to flutter\n */\nfun Faraday.postNotification(key: String, arguments: Any?) {\n    FaradayNotice.post(key, arguments)\n}\n\n/**\n * receive notification from flutter\n */\nfun Faraday.registerNotification(key: String, callback: (arguments: Any?) -> Unit) {\n    FaradayNotice.register(key, callback)\n}\n\nfun Faraday.unregisterNotification(key: String) {\n    FaradayNotice.unregister(key)\n}"
  },
  {
    "path": "doc/bridge.md",
    "content": "# 桥接原生方法\n\n作为一个原生为主的混合应用，原生代码层肯定已经有了大量的基础设施例如加解密，或者本机缓存等等。想要调用这些本地`服务`有两种方式：\n\n## FaradayCommon\n\nfaraday定义了一个特定的[channel](https://flutter.dev/docs/development/platform-integration/platform-channels)用于处理类似的需求。首先iOS/Android 需要实现指定接口\n\n> 针对FaradayCommon我们提供了相应的[cli](https://github.com/gfaraday/cli)用来自动解析参数生成对应的接口文件\n\n### flutter\n\n``` dart\nFaradayCommon.invokeMethod('method', 'arguments');\n```\n\n### ios\n\n``` swift\n\n// 0x00 定义一个用来处理 flutter端调用的处理函数，然后在Faraday初始化时传递给engine\nfunc handle(_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Void {\n    // doSomething\n}\n\n// 0x01\nFaraday.default.startFlutterEngine(navigatorDelegate: navigator, commonHandler: handle(_:_:_:))\n\n```\n\n### android\n\n``` kotlin\n\n// 0x00 首先需要实现这个接口 MethodChannel.MethodCallHandler\nclass CommonHandler: MethodChannel.MethodCallHandler {\n    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {\n        print(\"Faraday-> ${call.method} not handle. argument: ${call.arguments}\")\n    }\n}\n\n// 0x01 Faraday 初始化以后，设置Handler给faraday即可\nFaraday.setCommonHandler(CommonHandler())\n\n```\n\n## 自定义channel\n\n你也可以完全自定义一个channel，用来处相应的逻辑\n\n``` dart\nconst _channel = MethodChannel('g_faraday_custom/common');\n\n//\n_channel.invokeMethod('method', 'arguments');\n```\n\n然后在ios/android端注册对应的channel 然后处理即可\n"
  },
  {
    "path": "doc/callback.md",
    "content": "# 页面间传值\n\n## Flutter侧\n\n在`flutter`这边传值比较容易，不管是`flutter->flutter`还是`flutter->native`或者`native-flutter`都和`纯flutter`写法无任何差异例如：\n\n``` dart\n\n// push 路由以后等待 被push的路由 pop时的result\nfinal result = await Navigator.of(context).push(route);\n\n// 关闭当前flutter页面，并将result传递到上一个页面\nNavigator.of(context).pop({'id': 1});\n\n```\n\n## iOS\n\n> 需要在 applicationDidFinish 中调用 `UIViewController.fa.automaticallyCallbackNullToFlutter()`\n\n一共有两种情况需要处理\n\n- native 打开一个flutter页面然后等待返回值\n\n``` swift\n\n// 初始化一个 FaradayFlutterViewController 的对象\nlet vc = FaradayFlutterViewController(page.name, arguments: page.arguments) { result in\n    /**\n        这里的 result 即flutter侧关闭页面时的回调\n\n        ``` dart\n        // 关闭并且传值\n        Navigator.of(context).pop({'id': 1});\n        ```\n    **/\n    debugPrint(result.toString() ?? '') // print {'id': 1}\n}\n```\n\n- 从flutter侧打开一个native页面， 然后等待native页面返回值\n\n``` dart\n\n// 从flutter打开native页面只需要调用\nfinal result = await Navigator.of(context).nativePushNamed('native_page_name');\n\n```\n\nflutter侧调用`nativePushNamed(:)`以后，native侧的`FaradayNavigationDelegate` `push`方法会被调用，只需要在此方法中 `push`一个对应页面的控制器即可，那么这个控制器如何回调给flutter层呢\n\n``` swift\n\n// flutter打开native，native回调值给flutter一共有3种情况\n\n// 假设被打开的控制器为：vc\n\n// 1.控制器是被 push的\nvc.navigatorController?.fa.popViewController(withResult: result, animation: true)\n\n// 2. 控制器是被 present的\nvc.fa.dismiss(withResult: result, animation: true)\n\n// 3. 控制器是被 `addChild` 等其他方式加载到当前堆栈的\n//    那么需要在 vc 移除堆栈时调用\nvc.fa.callback(result: result)\n\n```\n\n## Android\n\n- 从`native`打开一个`flutter`页面，然后等待`flutter`返回值,与打开原生页面无异\n\n``` kotlin\n\n   //以 startActivityForResult方式打开flutter页面,FaradayActivity为flutter页面容器\nval intent = FaradayActivity.build(context, route,arguments)\nstartActivityForResult(intent, requestCode)\n\n...\n   //重写onActivityResult方法获得返回值\noverride fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n    super.onActivityResult(requestCode, resultCode, data)\n    val value = data?.getStringExtra(\"key\")\n    //TODO ...\n}\n\n```\n\n- 从`flutter`打开一个`native`页面， 然后等待`native`页面返回值\n\n打开`native`页面,并等待返回值\n\n```dart\nNavigator.of(context).nativePushNamed('native route').then((result) {\n      print('返回值：$result')\n});\n```\n\n`native`页面返回值给`flutter`，只能传递flutter支持的数据类型\n\n```kotlin\n//传递基础数据类型\nsetResult(RESULT_OK, Intent().apply {\n    putExtra(\"result\", \"data form native\")\n}\n//传递HashMap，map泛型须为基础类型\nsetResult(RESULT_OK, Intent().apply {\n    putExtra(\"result\", hashMapOf(\"data\" to 123))\n}\n//传递ArrayList,ArrayList中只能是String或Int\nsetResult(RESULT_OK, Intent().apply {\n    putStringArrayListExtra(\"result\", ArrayList())\n})\n\n//复杂数据建议转换成json字符串传递\n});\n```\n\n## 其他特殊场景路由处理\n\n### 在`flutter`中打开一个新的native页面用来`push` `flutter`路由\n\n``` dart\n\n// 在原生`ios|android`的`FaradayNavigationDelegate`中根据对应的`name`和`arguments`返回`FaradayFlutterViewController`即可\nNavigator.of(context).nativePushNamed('native_page_name', options: {'flutter': true});\n\n```\n\n### 关闭当前`flutter`容器\n\n``` dart\n\nNavigator.of(context).nativePop(result);\n\n```\n"
  },
  {
    "path": "doc/ci.md",
    "content": "# TODO 后面写详细文档\n"
  },
  {
    "path": "doc/ios-simulator-install.md",
    "content": "\n# ios 模拟器安装app\n\n``` shell\n\n# 启动模拟器\nxcrun instruments -w 'iPhone 12'\n\n# 安装\nxcrun simctl install booted path/to/example.app\n\n```\n"
  },
  {
    "path": "doc/ios_navigation_bar.md",
    "content": "# iOS Navigation Bar\n\n`FlutterViewController` 需要隐藏`navigation bar`,因此我们需要在这个vc显示隐藏的时候对应的处理`navigation bar`的隐藏显示逻辑。这里我们提供了一个扩展用来自动处理显示隐藏逻辑\n\n``` swift\n// 自动处理 Navigation bar逻辑，内部由method_swizzle实现， 请保证此方法只会调用一次\nUINavigationController.fa.automaticallyHandleNavigationBarHidden()\n\n```\n\n如果你原生的页面也需要隐藏`navigation bar`，那么你只需要实现此协议即可\n\n``` swift\n\nextension SomeViewController: FaradayNavigationBarHiddenProtocol { }\n\n```\n"
  },
  {
    "path": "doc/json.md",
    "content": "# JSON\n\njson在我们日常开发中已经变的非常重要了，用来传递数据可读性非常的好。我们将对json的处理单独剥离出来成为一个独立的`package`:\n\n[https://pub.dev/packages/g_json](https://pub.dev/packages/g_json)\n\n同时我们在`faraday`中也提供了以下扩展方法\n\n``` dart\n\nextension RouteSettingsFaraday on RouteSettings {\n  ///\n  /// eg:\n  /// final arg = settings.toJson;\n  /// final id = arg.id;\n  /// final name = arg.name;\n  /// final types = arg.types;\n  ///\n  dynamic get toJson => JSON(arguments);\n}\n```\n\n在使用`RouteSettings`来创建页面的时候可以很方便的读取参数\n"
  },
  {
    "path": "doc/net.md",
    "content": "# Net\n\n`g_faraday`默认现有的`ios`&`android`已经存在大量的网络基础设施(包括但不限于登录验证，加解密等等)\n\n> 如果没有没有你可以跳过此部分内容\n\n## Flutter\n\n`flutter`侧我们提供了`FaradayNet`用来进行网络请求\n\n``` dart\n\nfinal response = await FaradayNet.request('get', '/user', parameters: {'id': 1}, headers: {'ua': 'g_faraday'});\n\n```\n\n## Native\n\nnative侧需要实现`flutter`侧的方法，在ios和android中定义如下\n\n### ios\n\n``` swift\n\n// 接口定义\npublic protocol FaradayHttpProvider: AnyObject {\n\n    func request(method: String, url: String, parameters: [String: Any]?, headers: [String: String]?, completion: @escaping (_ result: Any?) -> Void) -> Void\n}\n\n// implementation example\nextension AppDelegate: FaradayHttpProvider {\n\n    func request(method: String, url: String, parameters: [String : Any]?, headers: [String : String]?, completion: @escaping (Any?) -> Void) {\n        let afHeaders = headers.map { HTTPHeaders($0) }\n        // 假设使用 Alamofire实现网络请求\n        let dataRequest = AF.request(url, method: HTTPMethod(rawValue: method.uppercased()), parameters: parameters, headers: afHeaders)\n        dataRequest.responseJSON { response in\n            switch response.result {\n                case .success(let data):\n                    completion([\"data\": data, \"errorCode\": 0])\n                case .failure(let error):\n                    completion([\"message\": error.localizedDescription, \"errorCode\": error.responseCode ?? 1])\n            }\n        }\n    }\n\n}\n\n// 使用\nFaraday.default.startFlutterEngine(navigatorDelegate: self, httpProvider: self, commonHandler: self.handle(_:_:_:), automaticallyRegisterPlugins: true)\n\n```\n\n### android\n\n``` kotlin\n\n// 定义\ninterface NetHandler {\n\n    /**\n     * @param method GET POST PUT DELETE ...\n     * @param url\n     * @param params request params\n     * @param headers request headers\n     * @param onComplete callback the request response\n     */\n    fun request(method: String, url: String, params: HashMap<String, Any>?, headers: HashMap<String, String>?, onComplete: (result: Any?) -> Unit)\n\n}\n\n//\nclass FaradayNet : NetHandler {\n    private val api = Net.create<FaradayFutureApi>()\n\n    interface FaradayFutureApi {\n\n        @GET\n        fun get(@Url url: String, @QueryMap params: HashMap<String, Any>?): Call<JsonElement>\n\n        @POST\n        fun post(@Url url: String, @Body body: HashMap<String, Any>?): Call<JsonElement>\n\n        @PUT\n        fun put(@Url url: String, @Body body: HashMap<String, Any>?): Call<JsonElement>\n\n        @DELETE\n        fun delete(@Url url: String, @QueryMap map: HashMap<String, Any>?): Call<JsonElement>\n    }\n\n    override fun request(method: String, url: String, params: HashMap<String, Any>?, headers: HashMap<String, String>?, onComplete: (result: Any?) -> Unit) {\n        val args = params ?: hashMapOf()\n        val netCall = when (method.toUpperCase(Locale.getDefault())) {\n            \"GET\" -> api.get(url, args)\n            \"POST\" -> api.post(url, args)\n            \"PUT\" -> api.put(url, args)\n            \"DELETE\" -> api.delete(url, args)\n            else -> throw RuntimeException(\"Unsupported method $method\")\n        }\n\n        MainScope().launch(NetErrorHandler) {\n            val response = netCall.call()\n            if (response.code() !in 200..300) {\n                throw HttpException(response)\n            }\n            onComplete.invoke(succeed(response.body()))\n        }.onError { code, message ->\n            onComplete.invoke(failed(code, message))\n        }\n    }\n\n    private suspend fun <T> Call<T>.call() = suspendCoroutine<Response<T>> { continuation ->\n        GlobalScope.launch(Dispatchers.IO) {\n            try {\n                val response = execute()\n                continuation.resume(response)\n            } catch (t: Throwable) {\n                continuation.resumeWithException(t)\n            }\n        }\n    }\n\n    private fun succeed(json: JsonElement?): Map<String, Any?> {\n        return mapOf(\"code\" to 200, \"data\" to json?.toString(), \"fromAndroid\" to true)\n    }\n\n    private fun failed(code: String, message: String): Map<String, Any?> {\n        return mapOf(\"code\" to code, \"msg\" to message)\n    }\n}\n\n//\nFaraday.setNetHandler(FaradayNet())\n\n```\n"
  },
  {
    "path": "doc/notification.md",
    "content": "# 通知\n\n通过全局的通知来传递数据，或者驱动业务不是一个很好的软件模式，但是在某些特定的场景却可以节省大量的时间。我们对混合app通知做了部分封装方便大家开发业务时使用。\n\n## flutter\n\n``` dart\n\n// 构造相应的通知对象\nfinal notification = FaradayNotification('NotificationKey', {'id': 1234});\n\n// 发送 （会同时发送到flutter和native）\nnotification.dispatchToGlobal(deliverToNative: true);\n\n// 接收 (可以同时接收到native和flutter通知)\nFaradayNotificationListener(\n      ['NotificationKey'],\n      onNotification: (n) => debugPrint('$n'),\n      child: xxx,\n    );\n```\n\n## ios\n\n``` swift\n\n// 发送 (只会发送到flutter，如需发送到native请自行广播)\nNotificationCenter.fa.post(name: \"NotificationKey\", object: [\"id\": 1234])\n\n// 接收 (可以同时接收到native和flutter通知)\nlet center = NSNotificationCenter.defaultCenter()\nlet mainQueue = NSOperationQueue.mainQueue()\nvar token: NSObjectProtocol?\ntoken = center.addObserverForName(\"NotificationKey\", object: nil, queue: mainQueue) { (note) in\n    print(\"Received the notification! \\(note)\")\n    center.removeObserver(token!)\n}\n\n```\n\n## android\n\n``` kotlin\n\n// 发送 (只会发送到flutter，如需发送到native请自行广播)\nFaraday.postNotification(\"NotificationKey\", mapOf(\"id\" to 1234))\n\n// 接收 (只能接收flutter侧通知)\nFaraday.registerNotification(\"NotificationKey\") { params ->\n    //解除注册\n    Faraday.unregisterNotification(\"NotificationKey\")\n}\n\n```\n"
  },
  {
    "path": "doc/route.md",
    "content": "# 路由\n\n`g_faraday`是作为一个解决混合路由栈的框架而开发的，因此对路由的支持特别完备。`g_faraday`采用最小入侵的设计原则，不管是在`native`侧还是`flutter`侧，只需要在程序入口处做少量的注册即可完成集成。\n同时页面跳转，页面间传值也不需要做任何自定义，也就是说一个纯flutter应用做很小量的改动即可无缝集成自现有应用。\n\n## flutter 侧路由\n\n在flutter侧我们只需要注册所有需要从原生打开的路由即可，其他不需要从原生直接进入的页面，不需要做任何改动。\n\n### 打开页面\n\n``` dart\n    Navigator.of(context).push('/home' {'id': 1234});\n```\n\n### 关闭页面\n\n``` dart\n    Navigator.of(context).pop({'succeed': true});\n```\n\n### 关闭所有flutter页面\n\n``` dart\n    Navigator.of(context).nativePop('result');\n```\n\n以上只是部分`Navigator`方法示例，理论上`g_faraday`支持所有原生的路由方法。\n\n## ios\n\nios端也特别类似只需要使用页面名称`name`和页面参数`arguments`来生成一个普通的`ViewController`即可，你可以使用`push`、`present`、`addChild`等任意方式将`ViewController`对象加入到页面栈即可\n\n``` swift\n\n    /// push\n    let vc = FaradayFlutterViewController(name, arguments: arguments)\n    navigatorController?.pushViewController(vc, animated: true)\n\n    // add to Tab bar Controller\n    let vc = FaradayFlutterViewController(name, arguments: arguments)\n    vc.willMove(toParent: self)\n    addChild(vc)\n    view.addSubview(vc.view)\n    vc.didMove(toParent: self)\n```\n\n## android\n\n同理android也可以作为一个独立的activity或者一个嵌入的fragment来使用\n\n``` kotlin\n    // 创建intent 然后start 即可\n    val intent = FaradayActivity.build(context, routeName, params)\n    context.startActivity(intent)\n\n    //\n    val fragment = FaradayFragment.newInstance(name, arguments)\n    // add fragment to fragment manager\n```\n"
  },
  {
    "path": "example/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Web related\nlib/generated_plugin_registrant.dart\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Exceptions to above rules.\n!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages\n\nlib/src/debug"
  },
  {
    "path": "example/.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: bbfbf1770cca2da7c82e887e4e4af910034800b6\n  channel: stable\n\nproject_type: app\n"
  },
  {
    "path": "example/.vscode/launch.json",
    "content": "{\n    \"configurations\": [\n        {\n            \"name\": \"g_faraday demo fluro\",\n            \"type\": \"dart\",\n            \"request\": \"launch\",\n            \"program\": \"lib/main_fluro.dart\",\n            \"args\": [\n                \"--no-sound-null-safety\"\n            ]\n        },\n        {\n            \"name\": \"g_faraday get fluro\",\n            \"type\": \"dart\",\n            \"request\": \"launch\",\n            \"program\": \"lib/main_get.dart\",\n            \"args\": [\n                \"--no-sound-null-safety\"\n            ]\n        },\n    ]\n}"
  },
  {
    "path": "example/.vscode/settings.json",
    "content": "{\n    \"cSpell.words\": [\n        \"ARGB\",\n        \"Scrollable\"\n    ]\n}"
  },
  {
    "path": "example/README.md",
    "content": "# g_faraday_example\n\n## 主要包含一下功能点 (TODO)\n\n### Basic\n\n* native -> flutter (ios: push/present android: activity/fragment)\n* flutter -> native (ios: handle navigation bar android: back button)\n* native -> flutter -> native ()\n* ios addChildViewController\n* android ViewPager Fragment\n\n### others\n\n* notification\n* getPlatformVersions\n"
  },
  {
    "path": "example/analysis_options.yaml",
    "content": "include: package:flutter_lints/flutter.yaml\n\nlinter:\n  rules:\n    public_member_api_docs: false\n    library_private_types_in_public_api: false"
  },
  {
    "path": "example/android/.gitignore",
    "content": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remember to never publicly share your keystore.\n# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app\nkey.properties\n"
  },
  {
    "path": "example/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 plugin: 'kotlin-android'\napply from: \"$flutterRoot/packages/flutter_tools/gradle/flutter.gradle\"\n\ndef keystoreProperties = new Properties()\ndef keystorePropertiesFile = rootProject.file('key.properties')\nif (keystorePropertiesFile.exists()) {\n    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))\n}\n\nandroid {\n    compileSdkVersion 33\n\n    sourceSets {\n        main.java.srcDirs += 'src/main/kotlin'\n    }\n\n    lintOptions {\n        disable 'InvalidPackage'\n    }\n\n    defaultConfig {\n        applicationId \"com.yuxiaor.flutter.g_faraday_example\"\n        minSdkVersion 23\n        targetSdkVersion 33\n        versionCode 2\n        versionName \"1.0.0\"\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\n    buildTypes {\n//       release {\n//           signingConfig signingConfigs.release\n//       }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n    kotlinOptions {\n        jvmTarget = '1.8'\n    }\n}\n\nflutter {\n    source '../..'\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'androidx.appcompat:appcompat:1.4.2'\n    implementation 'androidx.core:core-ktx:1.9.0-alpha05'\n    implementation 'com.google.android.material:material:1.6.1'\n    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'\n    implementation 'androidx.navigation:navigation-fragment-ktx:2.4.2'\n    implementation 'androidx.navigation:navigation-ui-ktx:2.4.2'\n}\n"
  },
  {
    "path": "example/android/app/release/output-metadata.json",
    "content": "{\n  \"version\": 2,\n  \"artifactType\": {\n    \"type\": \"APK\",\n    \"kind\": \"Directory\"\n  },\n  \"applicationId\": \"com.yuxiaor.flutter.g_faraday_example\",\n  \"variantName\": \"processReleaseResources\",\n  \"elements\": [\n    {\n      \"type\": \"SINGLE\",\n      \"filters\": [],\n      \"versionCode\": 1,\n      \"versionName\": \"1.0\",\n      \"outputFile\": \"app-release.apk\"\n    }\n  ]\n}"
  },
  {
    "path": "example/android/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.yuxiaor.flutter.g_faraday_example\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".App\"\n        android:allowBackup=\"false\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"Faraday\"\n        android:theme=\"@style/AppTheme\">\n\n        <meta-data\n            android:name=\"flutterEmbedding\"\n            android:value=\"2\" />\n\n        <activity\n            android:name=\".activity.SingleTopFlutterActivity\"\n            android:launchMode=\"singleTop\" />\n        <activity\n            android:name=\".activity.SingleTaskFlutterActivity\"\n            android:launchMode=\"singleTask\" />\n\n        <activity android:name=\".activity.splash.FirstFlutterActivity\">\n\n            <!-- 在这里你可以自定义 启动画面动画 -->\n<!--            <meta-data-->\n<!--                android:name=\"io.flutter.embedding.android.SplashScreenDrawable\"-->\n<!--                android:resource=\"@drawable/launch_background\" />-->\n            <meta-data\n                android:name=\"io.flutter.embedding.android.NormalTheme\"\n                android:resource=\"@style/SplashTheme\"\n                />\n\n        </activity>\n\n        <activity android:name=\".basic.FlutterToNativeActivity\" />\n        <activity android:name=\".basic.Native2FlutterActivity\" />\n        <activity android:name=\".basic.TabContainerActivity\" />\n\n        <activity android:name=\".activity.MainActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <activity android:name=\".basic.TransparentBackgroundFlutterActivity\" android:theme=\"@style/TransparentActivityTheme\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/App.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example\n\nimport android.app.Application\nimport com.yuxiaor.flutter.g_faraday.Faraday\nimport com.yuxiaor.flutter.g_faraday_example.faraday.CustomNavigator\n\n/**\n * Author: Edward\n * Date: 2020-09-02\n * Description:\n */\nclass App : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        Faraday.startFlutterEngine(this, CustomNavigator)\n    }\n}\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/activity/MainActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.activity\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport com.yuxiaor.flutter.g_faraday_example.R\nimport com.yuxiaor.flutter.g_faraday_example.activity.splash.FirstFlutterActivity\n\nclass MainActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_main)\n    }\n\n    override fun onStart() {\n        super.onStart()\n\n        // 跳转到 flutter `home` 路由\n        val intent = FirstFlutterActivity.build(this)\n\n        // 直接打开flutter 页面\n        startActivity(intent)\n\n        //\n        finish()\n\n        // 阻止动画\n        overridePendingTransition(0, 0)\n\n    }\n}\n"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/activity/SingleTaskFlutterActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.activity\n\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\n\n// https://hit-alibaba.github.io/interview/Android/basic/Android-LaunchMode.html\nclass SingleTaskFlutterActivity: FaradayActivity()"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/activity/SingleTopFlutterActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.activity\n\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\n\n// https://hit-alibaba.github.io/interview/Android/basic/Android-LaunchMode.html\nclass SingleTopFlutterActivity: FaradayActivity()"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/activity/splash/FirstFlutterActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.activity.splash\n\nimport android.content.Context\nimport android.os.Build\nimport android.os.Bundle\nimport android.window.SplashScreenView\nimport com.yuxiaor.flutter.g_faraday.Faraday\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\nimport com.yuxiaor.flutter.g_faraday.channels.postNotification\nimport com.yuxiaor.flutter.g_faraday.channels.registerNotification\nimport com.yuxiaor.flutter.g_faraday.channels.unregisterNotification\nimport com.yuxiaor.flutter.g_faraday_example.widget.NotificationDialog\n\n\nclass FirstFlutterActivity : FaradayActivity() {\n\n    companion object {\n        fun build(context: Context) = builder<FirstFlutterActivity>(\"home\", null, true).build(context)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        Faraday.registerNotification(\"GlobalNotification\") {\n            showNotification()\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            // Disable the Android splash screen fade out animation to avoid\n            // a flicker before the similar frame is drawn in Flutter.\n            splashScreen\n                .setOnExitAnimationListener { splashScreenView: SplashScreenView -> splashScreenView.remove() }\n        }\n    }\n\n    private fun showNotification() {\n        NotificationDialog(this, \"Notification from Flutter\").apply {\n            setOnDismissListener {\n                Faraday.postNotification(\"NotificationFromNative\", \"Hi, Android ${Build.VERSION.RELEASE}\")\n            }\n        }.show()\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n        Faraday.unregisterNotification(\"GlobalNotification\")\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/basic/FlutterToNativeActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.basic\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.widget.Button\nimport androidx.appcompat.app.AppCompatActivity\nimport com.yuxiaor.flutter.g_faraday_example.R\nimport java.util.*\n\n/**\n * Author: Edward\n * Date: 2020-11-26\n * Description:\n */\nclass FlutterToNativeActivity : AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_flutter2native)\n        findViewById<Button>(R.id.btn).setOnClickListener {\n            val intent = Intent()\n            intent.putExtra(\"date\", Date().toString())\n            setResult(RESULT_OK, intent)\n            finish()\n        }\n        actionBar?.title = \"Flutter2Native\"\n    }\n\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/basic/Native2FlutterActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.basic\n\nimport android.content.Intent\nimport android.graphics.Color\nimport android.os.Bundle\nimport android.widget.Button\nimport android.widget.TextView\nimport androidx.appcompat.app.AppCompatActivity\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\nimport com.yuxiaor.flutter.g_faraday_example.R\nimport com.yuxiaor.flutter.g_faraday_example.faraday.KEY_ARGS\nimport java.util.*\n\nclass Native2FlutterActivity: AppCompatActivity() {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_native2flutter)\n\n        findViewById<Button>(R.id.button).setOnClickListener {\n            val intent = FaradayActivity.builder(routeName = \"native2flutter\", Date().toString()).build(this)\n            startActivityForResult(intent, 1)\n        }\n\n        findViewById<Button>(R.id.transparentButton).setOnClickListener {\n            val intent = TransparentBackgroundFlutterActivity.build(this)\n            startActivity(intent)\n            // 阻止动画\n            overridePendingTransition(0, 0)\n        }\n\n        actionBar?.title = \"Native2Flutter\"\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {\n        super.onActivityResult(requestCode, resultCode, data)\n        data?.extras.let {\n            val textView = findViewById<TextView>(R.id.result)\n            if (it != null) {\n                textView.text = it.get(KEY_ARGS)?.toString()\n                textView.setTextColor(Color.RED)\n            } else {\n                textView.text = null\n            }\n        }\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/basic/TabContainerActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.basic\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.widget.RadioButton\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport com.yuxiaor.flutter.g_faraday.FaradayFragment\nimport com.yuxiaor.flutter.g_faraday_example.R\nimport com.yuxiaor.flutter.g_faraday_example.fragment.TestFragment\n\nclass TabContainerActivity : AppCompatActivity() {\n\n    private var tempFragment: Fragment? = null\n    private val flutterFrag1 = FaradayFragment.newInstance(\"tab1\")\n    private val flutterFrag2 = FaradayFragment.newInstance(\"home\")\n    private val nativeFrag1 = TestFragment.newInstance(\"native fragment 1\")\n    private val nativeFrag2 = TestFragment.newInstance(\"native fragment 2\")\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_tab_container)\n\n        val tab1 = findViewById<RadioButton>(R.id.tab1)\n        val tab2 = findViewById<RadioButton>(R.id.tab2)\n        val tab3 = findViewById<RadioButton>(R.id.tab3)\n        val tab4 = findViewById<RadioButton>(R.id.tab4)\n\n        tab1.setOnClickListener { switchFragment(flutterFrag1, \"F1\") }\n        tab2.setOnClickListener { switchFragment(nativeFrag1, \"N1\") }\n        tab3.setOnClickListener { switchFragment(flutterFrag2, \"F2\") }\n        tab4.setOnClickListener { switchFragment(nativeFrag2, \"N2\") }\n\n        switchFragment(flutterFrag1, \"F1\")\n    }\n\n    private fun switchFragment(fragment: Fragment, tag: String) {\n        if (tempFragment == fragment) return\n        if (tag == \"F2\") {\n            supportActionBar?.hide()\n        } else {\n            supportActionBar?.show()\n        }\n        val transaction = supportFragmentManager.beginTransaction()\n        if (!fragment.isAdded) {\n            transaction.add(R.id.fragment_container, fragment, tag)\n        }\n        transaction.show(fragment)\n        tempFragment?.let { transaction.hide(it) }\n//        transaction.replace(R.id.frag, fragment)\n//        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)\n//        transaction.addToBackStack(null)\n        tempFragment = fragment\n        transaction.commitNow()\n    }\n\n    override fun onTrimMemory(level: Int) {\n        super.onTrimMemory(level)\n        if (tempFragment is FaradayFragment) {\n            (tempFragment as FaradayFragment).onTrimMemory(level)\n        }\n    }\n\n    override fun onUserLeaveHint() {\n        super.onUserLeaveHint()\n        if (tempFragment is FaradayFragment) {\n            (tempFragment as FaradayFragment).onUserLeaveHint()\n        }\n    }\n\n    override fun onNewIntent(intent: Intent?) {\n        super.onNewIntent(intent)\n        if (tempFragment is FaradayFragment && intent != null) {\n            (tempFragment as FaradayFragment).onNewIntent(intent)\n        }\n    }\n\n    override fun onPostResume() {\n        super.onPostResume()\n        if (tempFragment is FaradayFragment) {\n            (tempFragment as FaradayFragment).onPostResume()\n        }\n    }\n\n    override fun onBackPressed() {\n        if (tempFragment is FaradayFragment) {\n            (tempFragment as FaradayFragment).onBackPressed()\n        } else {\n            super.onBackPressed()\n        }\n    }\n\n    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (tempFragment is FaradayFragment) {\n            (tempFragment as FaradayFragment).onRequestPermissionsResult(requestCode, permissions, grantResults)\n        }\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/basic/TransparentBackgroundFlutterActivity.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.basic\n\nimport android.content.Context\nimport android.graphics.Color\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\n\nclass TransparentBackgroundFlutterActivity: FaradayActivity() {\n    companion object {\n        fun build(context: Context) = builder<TransparentBackgroundFlutterActivity>(\"transparent_flutter\",\n                backgroundColor = Color.TRANSPARENT).build(context)\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/basic/fragments/NativeFragment.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.basic.fragments\n\nimport androidx.fragment.app.Fragment\n\nclass NativeFragment: Fragment() {\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/faraday/CustomNavigator.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.faraday\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.graphics.Color\nimport android.net.Uri\nimport com.yuxiaor.flutter.g_faraday.Faraday\nimport com.yuxiaor.flutter.g_faraday.FaradayActivity\nimport com.yuxiaor.flutter.g_faraday.FaradayNavigator\nimport com.yuxiaor.flutter.g_faraday.Options\nimport com.yuxiaor.flutter.g_faraday_example.activity.SingleTaskFlutterActivity\nimport com.yuxiaor.flutter.g_faraday_example.activity.SingleTopFlutterActivity\nimport com.yuxiaor.flutter.g_faraday_example.basic.FlutterToNativeActivity\nimport com.yuxiaor.flutter.g_faraday_example.basic.Native2FlutterActivity\nimport com.yuxiaor.flutter.g_faraday_example.basic.TabContainerActivity\nimport com.yuxiaor.flutter.g_faraday_example.basic.TransparentBackgroundFlutterActivity\nimport java.io.Serializable\n\nconst val KEY_ARGS = \"_args\"\n\nobject CustomNavigator : FaradayNavigator {\n\n    override fun create(name: String, arguments: Serializable?, options: Options): Intent? {\n        val context = Faraday.getCurrentActivity() ?: return null\n\n        if (options.isFlutterRoute) {\n\n            // singleTask 模式\n            val builder = FaradayActivity.builder(name, arguments, false)\n\n            // 你看到的绿色的闪屏就是这个\n            builder.backgroundColor = Color.WHITE\n            builder.activityClass = SingleTopFlutterActivity::class.java\n\n            return builder.build(context);\n        }\n\n\n        when (name) {\n            \"flutter2native\" -> {\n                return Intent(context, FlutterToNativeActivity::class.java)\n            }\n            \"native2flutter\" -> {\n                return Intent(context, Native2FlutterActivity::class.java)\n            }\n            \"tabContainer\" -> {\n                return Intent(context, TabContainerActivity::class.java)\n            }\n            else -> {\n                val intent = Intent(Intent.ACTION_VIEW)\n                intent.data = Uri.parse(name)\n                intent.putExtra(KEY_ARGS, arguments)\n                return intent\n            }\n        }\n\n    }\n\n    override fun pop(result: Serializable?) {\n        val activity = Faraday.getCurrentActivity() ?: return\n        if (result != null) {\n            activity.setResult(Activity.RESULT_OK, Intent().apply { putExtra(KEY_ARGS, result) })\n        }\n        activity.finish()\n\n        if (activity is TransparentBackgroundFlutterActivity) {\n            activity.overridePendingTransition(0, 0)\n        }\n    }\n\n    override fun enableSwipeBack(enable: Boolean) {\n\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/fragment/TestFragment.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.fragment\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.fragment.app.Fragment\nimport com.yuxiaor.flutter.g_faraday_example.R\n\n/**\n * Author: Edward\n * Date: 2020-09-07\n * Description:\n */\nclass TestFragment : Fragment() {\n\n\n    companion object {\n\n        fun newInstance(text: String): TestFragment {\n            return TestFragment().apply {\n                arguments = Bundle().apply {\n                    putString(\"text\", text)\n                }\n            }\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {\n        return inflater.inflate(R.layout.frag_test, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val textView = view.findViewById<TextView>(R.id.fragText)\n        textView.text = arguments?.getString(\"text\")\n    }\n\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/utils/ViewExt.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.utils\n\nimport android.content.res.Resources\nimport android.graphics.Outline\nimport android.util.TypedValue\nimport android.view.View\nimport android.view.ViewOutlineProvider\n\n/**\n * Author: Edward\n * Date: 2020-11-27\n * Description:\n */\nval Float.dp\n    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)\nval Int.dp\n    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics).toInt()\nval Float.sp\n    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics)\n\nfun View.setCorner(corner: Float) {\n    clipToOutline = true\n    outlineProvider = object : ViewOutlineProvider() {\n        override fun getOutline(view: View, outline: Outline) {\n            outline.setRoundRect(0, 0, view.measuredWidth, view.measuredHeight, corner.dp)\n        }\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/widget/BaseDialog.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.widget\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.Gravity\nimport android.view.WindowManager\nimport androidx.appcompat.app.AlertDialog\nimport com.yuxiaor.flutter.g_faraday_example.R\n\n/**\n * @Author Edward\n * @Date 2019/5/11 0011\n * @Description:\n */\nabstract class BaseDialog(context: Context) : AlertDialog(context, R.style.DialogTheme) {\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setWindow()\n    }\n\n    private fun setWindow() {\n        val params = window?.attributes\n        params?.width = WindowManager.LayoutParams.MATCH_PARENT\n        params?.height = WindowManager.LayoutParams.WRAP_CONTENT\n        params?.gravity = gravity()\n        params?.dimAmount = alpha()\n        window?.attributes = params\n        if (anim() != -1) {\n            window?.setWindowAnimations(anim())\n        }\n    }\n\n    /**\n     * 位置\n     */\n    open fun gravity(): Int {\n        return Gravity.CENTER\n    }\n\n    /**\n     * 动画\n     */\n    open fun anim(): Int {\n        return -1\n    }\n\n    /**\n     * 背景透明度\n     */\n    open fun alpha(): Float {\n        return 0.5f\n    }\n\n}"
  },
  {
    "path": "example/android/app/src/main/kotlin/com/yuxiaor/flutter/g_faraday_example/widget/NotificationDialog.kt",
    "content": "package com.yuxiaor.flutter.g_faraday_example.widget\n\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport android.widget.RelativeLayout\nimport android.widget.TextView\nimport com.yuxiaor.flutter.g_faraday_example.R\nimport com.yuxiaor.flutter.g_faraday_example.utils.setCorner\n\n/**\n * Author: Edward\n * Date: 2020-11-27\n * Description:\n */\nclass NotificationDialog(context: Context, private val msg: String) : BaseDialog(context), Runnable {\n\n    private val view by lazy { findViewById<RelativeLayout>(R.id.contentView) }\n    private val titleTxt by lazy { findViewById<TextView>(R.id.titleTxt) }\n    private val msgTxt by lazy { findViewById<TextView>(R.id.msgTxt) }\n    private val handler by lazy { Handler(Looper.getMainLooper()) }\n    private var time = 3\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setCancelable(false)\n        setContentView(R.layout.dialog_notification)\n        view?.setCorner(8f)\n        msgTxt?.text = msg\n        handler.post(this)\n    }\n\n    @SuppressLint(\"SetTextI18n\")\n    override fun run() {\n        titleTxt?.text = \"Notification (${time})\"\n        time--\n        if (time >= 0) {\n            handler.postDelayed(this, 1000)\n        } else {\n            handler.removeCallbacks(this)\n            dismiss()\n        }\n    }\n}"
  },
  {
    "path": "example/android/app/src/main/res/anim/in_from_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXDelta=\"-100%p\"\n    android:fromYDelta=\"0\"\n    android:toXDelta=\"0\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "example/android/app/src/main/res/anim/in_from_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXDelta=\"100%p\"\n    android:fromYDelta=\"0\"\n    android:toXDelta=\"0\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "example/android/app/src/main/res/anim/out_from_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXDelta=\"0\"\n    android:fromYDelta=\"0\"\n    android:toXDelta=\"-100%p\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "example/android/app/src/main/res/anim/out_from_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"300\"\n    android:fromXDelta=\"0\"\n    android:fromYDelta=\"0\"\n    android:toXDelta=\"100%p\"\n    android:toYDelta=\"0\" >\n\n</translate>"
  },
  {
    "path": "example/android/app/src/main/res/color/check_primary_light.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/colorPrimary\" android:state_checked=\"true\" />\n    <item android:color=\"@color/light\" android:state_checked=\"false\" />\n</selector>"
  },
  {
    "path": "example/android/app/src/main/res/drawable/launch_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@android:color/white\" />\n\n    <item>\n        <bitmap\n            android:gravity=\"center\"\n            android:src=\"@mipmap/ic_launcher\" />\n    </item>\n</layer-list>\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/tab_file.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"1024\"\n    android:viewportHeight=\"1024\">\n    <path\n        android:fillColor=\"@color/check_primary_light\"\n        android:pathData=\"M365.71,128l41.87,91.43h208.82L658.29,128h91.43a109.71,109.71 0,0 1,109.71 109.71v548.57a109.71,109.71 0,0 1,-109.71 109.71L274.29,896a109.71,109.71 0,0 1,-109.71 -109.71L164.57,237.71a109.71,109.71 0,0 1,109.71 -109.71zM676.57,603.43L347.43,603.43a36.57,36.57 0,0 0,0 73.14h329.14a36.57,36.57 0,0 0,0 -73.14zM676.57,438.86L347.43,438.86a36.57,36.57 0,0 0,0 73.14h329.14a36.57,36.57 0,0 0,0 -73.14z\" />\n</vector>\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/tab_home.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"1024\"\n    android:viewportHeight=\"1024\">\n    <path\n        android:fillColor=\"@color/check_primary_light\"\n        android:pathData=\"M528.46,126.54l333.71,254.72A49.55,49.55 0,0 1,881.37 420.57v432.64a49.01,49.01 0,0 1,-49.01 49.19L184.14,902.4a49.01,49.01 0,0 1,-49.01 -49.19L135.13,420.57a49.19,49.19 0,0 1,18.29 -38.22L467.75,128a49.19,49.19 0,0 1,60.71 -1.46zM699.98,506.51a29.26,29.26 0,0 0,-41.14 6.4c-47.36,64.91 -97.65,96 -151.77,96S402.29,577.83 352.73,512l-1.83,-2.19A29.44,29.44 0,0 0,305.55 548.57c59.43,78.81 126.72,119.77 201.14,119.77s142.08,-41.69 199.86,-119.77l1.46,-2.38a29.26,29.26 0,0 0,-8.05 -39.68z\" />\n</vector>\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/tab_house.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"1024\"\n    android:viewportHeight=\"1024\">\n    <path\n        android:fillColor=\"@color/check_primary_light\"\n        android:pathData=\"M603.43,138.97a54.86,54.86 0,0 1,54.86 54.86v694.86L199.31,888.69A57.23,57.23 0,0 1,146.29 828.34L146.29,193.83a54.86,54.86 0,0 1,54.86 -54.86zM841.14,413.26a36.57,36.57 0,0 1,36.57 36.57v402.29a36.57,36.57 0,0 1,-36.57 36.57h-128v-438.86a36.57,36.57 0,0 1,36.57 -36.57zM316.34,416.91a32,32 0,0 0,-31.09 31.09v54.86a29.81,29.81 0,0 0,31.09 31.09,32 32,0 0,0 31.09,-31.09v-54.86a32,32 0,0 0,-31.09 -31.09zM491.89,416.91a32,32 0,0 0,-31.09 31.09v54.86a28.89,28.89 0,0 0,31.09 31.09,32 32,0 0,0 31.09,-31.09v-54.86a32,32 0,0 0,-31.09 -31.09z\" />\n</vector>\n"
  },
  {
    "path": "example/android/app/src/main/res/drawable/tab_msg.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"1024\"\n    android:viewportHeight=\"1024\">\n    <path\n        android:fillColor=\"@color/check_primary_light\"\n        android:pathData=\"M841.14,171.7A66.01,66.01 0,0 1,907.15 237.71v472.32A66.01,66.01 0,0 1,841.14 776.05L629.58,776.05l-84.11,98.01a47.73,47.73 0,0 1,-67.29 5.3l-4.94,-5.12 -85.21,-98.19L182.86,776.05a66.01,66.01 0,0 1,-66.01 -66.01L116.85,237.71A66.01,66.01 0,0 1,182.86 171.7zM329.14,420.57a54.86,54.86 0,1 0,54.86 54.86,54.86 54.86,0 0,0 -54.86,-54.86zM512,420.57a54.86,54.86 0,1 0,54.86 54.86,54.86 54.86,0 0,0 -54.86,-54.86zM694.86,420.57a54.86,54.86 0,1 0,54.86 54.86,54.86 54.86,0 0,0 -54.86,-54.86z\" />\n</vector>\n"
  },
  {
    "path": "example/android/app/src/main/res/layout/activity_flutter2native.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n\n    <Button\n        android:id=\"@+id/btn\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"带参数返回\"\n        tools:ignore=\"HardcodedText\" />\n</LinearLayout>"
  },
  {
    "path": "example/android/app/src/main/res/layout/activity_fragment.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <FrameLayout\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n\n\n    <RadioGroup\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <RadioButton\n            android:id=\"@+id/tab1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:checked=\"true\"\n            android:drawableTop=\"@drawable/tab_home\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_house\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_file\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab4\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_msg\"\n            android:gravity=\"center\" />\n\n\n    </RadioGroup>\n\n</LinearLayout>"
  },
  {
    "path": "example/android/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:padding=\"24dp\"/>"
  },
  {
    "path": "example/android/app/src/main/res/layout/activity_native2flutter.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/textView2\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"16.0dp\"\n        android:paddingTop=\"16dp\"\n        android:paddingEnd=\"16dp\"\n        android:paddingBottom=\"16dp\"\n        android:text=\"@string/native2flutter_tip\" />\n\n    <TextView\n        android:id=\"@+id/result\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingStart=\"16dp\"\n        tools:ignore=\"RtlSymmetry\" />\n\n    <Button\n        android:id=\"@+id/button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"@string/open_flutter\" />\n\n    <Button\n        android:id=\"@+id/transparentButton\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"Open Transparent Flutter Page\" />\n</LinearLayout>"
  },
  {
    "path": "example/android/app/src/main/res/layout/activity_tab_container.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <FrameLayout\n        android:id=\"@+id/fragment_container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\" />\n\n\n    <RadioGroup\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\">\n\n        <RadioButton\n            android:id=\"@+id/tab1\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:checked=\"true\"\n            android:drawableTop=\"@drawable/tab_home\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab2\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_house\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab3\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_file\"\n            android:gravity=\"center\" />\n\n        <RadioButton\n            android:id=\"@+id/tab4\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:button=\"@null\"\n            android:drawableTop=\"@drawable/tab_msg\"\n            android:gravity=\"center\" />\n\n\n    </RadioGroup>\n\n</LinearLayout>"
  },
  {
    "path": "example/android/app/src/main/res/layout/dialog_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/contentView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\"\n    android:layout_margin=\"24dp\"\n    android:background=\"@color/white\"\n    android:minHeight=\"200dp\">\n\n    <TextView\n        android:id=\"@+id/titleTxt\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/colorPrimary\"\n        android:gravity=\"center\"\n        android:padding=\"12dp\"\n        android:textColor=\"@color/white\"\n        android:textSize=\"16sp\"\n        android:textStyle=\"bold\"\n        tools:text=\"Title\" />\n\n    <TextView\n        android:id=\"@+id/msgTxt\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:gravity=\"center\"\n        android:textColor=\"@color/dark\"\n        tools:text=\"Notification form Flutter\" />\n\n</RelativeLayout>"
  },
  {
    "path": "example/android/app/src/main/res/layout/frag_test.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n\n    <TextView\n        android:id=\"@+id/fragText\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:gravity=\"center\"\n        android:text=\"native fragment\"\n        tools:ignore=\"HardcodedText\" />\n\n\n</LinearLayout>"
  },
  {
    "path": "example/android/app/src/main/res/navigation/nav_graph.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/nav_graph\"\n    app:startDestination=\"@id/FirstFragment\">\n\n    <fragment\n        android:id=\"@+id/FirstFragment\"\n        android:name=\"com.yuxiaor.flutter.g_faraday_example.FirstFragment\"\n        android:label=\"@string/first_fragment_label\"\n        tools:layout=\"@layout/fragment_first\">\n\n        <action\n            android:id=\"@+id/action_FirstFragment_to_SecondFragment\"\n            app:destination=\"@id/SecondFragment\" />\n    </fragment>\n    <fragment\n        android:id=\"@+id/SecondFragment\"\n        android:name=\"com.yuxiaor.flutter.g_faraday_example.SecondFragment\"\n        android:label=\"@string/second_fragment_label\"\n        tools:layout=\"@layout/fragment_second\">\n\n        <action\n            android:id=\"@+id/action_SecondFragment_to_FirstFragment\"\n            app:destination=\"@id/FirstFragment\" />\n    </fragment>\n</navigation>"
  },
  {
    "path": "example/android/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#6200EE</color>\n    <color name=\"colorPrimaryDark\">#3700B3</color>\n    <color name=\"colorAccent\">#D6E1E0</color>\n    <color name=\"light\">#CCCCCC</color>\n    <color name=\"dark\">#333333</color>\n    <color name=\"white\">#FFFFFF</color>\n    <color name=\"transparent_background\">#50000000</color>\n</resources>"
  },
  {
    "path": "example/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"back_button_title\">带参数返回</string>\n    <string name=\"native2flutter_tip\">从原生打开flutter只需要使用 FaradayActivity.builder 构造相应的Intent，然后startActivityForResult\\n\\n 注意\\n打开的路由必须在flutter入口处注册</string>\n    <string name=\"open_flutter\">Open Flutter</string>\n    <string name=\"title_activity_transparent_background\">TransparentBackgroundActivity</string>\n    <!-- Strings used for fragments for navigation -->\n    <string name=\"first_fragment_label\">First Fragment</string>\n    <string name=\"second_fragment_label\">Second Fragment</string>\n    <string name=\"next\">Next</string>\n    <string name=\"previous\">Previous</string>\n\n    <string name=\"hello_first_fragment\">Hello first fragment</string>\n    <string name=\"hello_second_fragment\">Hello second fragment. Arg: %1$s</string>\n</resources>"
  },
  {
    "path": "example/android/app/src/main/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <item name=\"android:windowAnimationStyle\">@style/WindowAnimTheme</item>\n    </style>\n\n    <style name=\"SplashTheme\"  parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowBackground\">@drawable/launch_background</item>\n    </style>\n\n    <style name=\"TransparentActivityTheme\">\n        <item name=\"android:windowBackground\">@color/transparent_background</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowAnimationStyle\">@android:style/Animation.Translucent</item>\n    </style>\n\n    <style name=\"WindowAnimTheme\">\n        <item name=\"android:activityOpenEnterAnimation\">@anim/in_from_right</item>\n        <item name=\"android:activityOpenExitAnimation\">@anim/out_from_left</item>\n        <item name=\"android:activityCloseEnterAnimation\">@anim/in_from_left</item>\n        <item name=\"android:activityCloseExitAnimation\">@anim/out_from_right</item>\n    </style>\n\n    <style name=\"FragTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n        <item name=\"android:windowAnimationStyle\">@style/WindowAnimTheme</item>\n    </style>\n\n    <style name=\"DialogTheme\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowIsTranslucent\">true</item>\n        <item name=\"android:windowNoTitle\">true</item>\n        <item name=\"android:background\">@android:color/transparent</item>\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:backgroundDimEnabled\">true</item>\n        <item name=\"android:backgroundDimAmount\">0.5</item>\n        <item name=\"android:windowSoftInputMode\">adjustResize</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "example/android/app/src/main/res/values-v31/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"SplashTheme\" parent=\"@android:style/Theme.Black.NoTitleBar\">\n        <item name=\"android:windowSplashScreenBackground\">@color/colorPrimary</item>\n        <item name=\"android:windowSplashScreenAnimatedIcon\">@drawable/launch_background</item>\n    </style>\n</resources>"
  },
  {
    "path": "example/android/app/src/profile/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.yuxiaor.flutter.g_faraday_example\">\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</manifest>\n"
  },
  {
    "path": "example/android/build.gradle",
    "content": "buildscript {\n    ext.kotlin_version = '1.6.21'\n    repositories {\n        maven { url 'https://maven.aliyun.com/repository/google/'}\n        maven { url 'https://maven.aliyun.com/repository/jcenter/'}\n    }\n\n    dependencies {\n        classpath 'com.android.tools.build:gradle:4.1.1'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    }\n}\n\nallprojects {\n    repositories {\n        maven { url 'https://maven.aliyun.com/repository/google/'}\n        maven { url 'https://maven.aliyun.com/repository/jcenter/'}\n    }\n}\n\nrootProject.buildDir = '../build'\nsubprojects {\n    project.buildDir = \"${rootProject.buildDir}/${project.name}\"\n}\nsubprojects {\n    project.evaluationDependsOn(':app')\n}\n\ntasks.register(\"clean\", Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "example/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "#Wed Sep 02 15:37:58 CST 2020\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.3-all.zip\n"
  },
  {
    "path": "example/android/gradle.properties",
    "content": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
  },
  {
    "path": "example/android/settings.gradle",
    "content": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Properties()\n\nassert localPropertiesFile.exists()\nlocalPropertiesFile.withReader(\"UTF-8\") { reader -> properties.load(reader) }\n\ndef flutterSdkPath = properties.getProperty(\"flutter.sdk\")\nassert flutterSdkPath != null, \"flutter.sdk not set in local.properties\"\napply from: \"$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle\"\n"
  },
  {
    "path": "example/ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "example/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>$(DEVELOPMENT_LANGUAGE)</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>MinimumOSVersion</key>\n  <string>9.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example/ios/Podfile",
    "content": "# Uncomment this line to define a global platform for your project\n platform :ios, '12.0'\n\n# CocoaPods analytics sends network stats synchronously affecting flutter build latency.\nENV['COCOAPODS_DISABLE_STATS'] = 'true'\n\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  use_frameworks!\n  use_modular_headers!\n  \n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "example/ios/Runner/AppDelegate.swift",
    "content": "import UIKit\nimport g_faraday\n\n@UIApplicationMain\n@objc class AppDelegate: UIResponder, UIApplicationDelegate {\n    \n    var window: UIWindow?\n    \n    func application(\n        _ application: UIApplication,\n        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n    ) -> Bool {\n        \n        // 自动处理导航栏\n        UINavigationController.fa.automaticallyHandleNavigationBarHidden()\n        // 自动回调空值到flutter侧，避免flutter侧 await 一直不返回\n        UIViewController.fa.automaticallyCallbackNullToFlutter()\n        \n        Faraday.default.startFlutterEngine(navigatorDelegate: self, httpProvider: nil, commonHandler: nil, automaticallyRegisterPlugins: true)\n        \n        return true\n    }\n}\n\nextension AppDelegate: FaradayNavigationDelegate {\n    \n    func push(_ name: String, arguments: Any?, options: Options, callback token: CallbackToken) {\n        var vc: UIViewController!\n        \n        switch name {\n            case \"flutter2native\":\n                vc = Flutter2NativeViewController()\n            case \"native2flutter\":\n                vc = Native2FlutterViewController()\n            case \"tabContainer\":\n                vc = UIStoryboard(name: \"TabContainer\", bundle: nil).instantiateInitialViewController()\n            case \"navigationBar\":\n                vc = UIStoryboard(name: \"Other\", bundle: nil).instantiateInitialViewController()\n            default:\n                vc = options.isFlutterRoute ? FaradayFlutterViewController(name, arguments: arguments) : Flutter2NativeViewController()\n        }\n        \n        let topMost = UIViewController.fa.topMost\n        if (options.present) {\n            topMost?.present(vc, animated: options.animated, completion: nil)\n        } else {\n            topMost?.navigationController?.pushViewController(vc, animated: options.animated)\n        }\n        \n        // 非常重要\n        // 如果此处不调用 `enableCallback` 那么flutter侧`await Navigator`则永远不会返回\n        vc.fa.enableCallback(with: token)\n    }   \n\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Icon-40.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-60.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-29.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-58.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-87.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-80.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-120.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-121.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"2x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon-180.png\",\n      \"idiom\" : \"iphone\",\n      \"scale\" : \"3x\",\n      \"size\" : \"60x60\"\n    },\n    {\n      \"filename\" : \"Icon-20.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-41.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"20x20\"\n    },\n    {\n      \"filename\" : \"Icon-30.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-59.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"filename\" : \"Icon-42.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-81.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\"\n    },\n    {\n      \"filename\" : \"Icon-76.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"1x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon-152.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"76x76\"\n    },\n    {\n      \"filename\" : \"Icon-167.png\",\n      \"idiom\" : \"ipad\",\n      \"scale\" : \"2x\",\n      \"size\" : \"83.5x83.5\"\n    },\n    {\n      \"filename\" : \"Icon-1024.png\",\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Icon-20.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"Icon-40.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"Icon-60.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "example/ios/Runner/Assets.xcassets/logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"Icon-60.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"filename\" : \"Icon-120.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"filename\" : \"Icon-180.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "example/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": "example/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17506\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"ABh-kg-K8H\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17505\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Mainavigation View Controller-->\n        <scene sceneID=\"4B2-ma-vOf\">\n            <objects>\n                <navigationController id=\"ABh-kg-K8H\" customClass=\"MainavigationViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"cPZ-PW-CcB\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"uWf-v2-u4P\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-1823\" y=\"114\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/Faraday/FaradayCommon.swift",
    "content": "//import Foundation\n//\n//  Created by faraday_cli on 2020-09-24 09:48:07.370618.\n//\n//    ___                   _\n//   / __\\_ _ _ __ __ _  __| | __ _ _   _\n//  / _\\/ _` | '__/ _` |/ _` |/ _` | | | |\n// / / | (_| | | | (_| | (_| | (_| | |_| |\n// \\/   \\__,_|_|  \\__,_|\\__,_|\\__,_|\\__, |\n//                                  |___/\n//\n// GENERATED CODE BY FARADAY CLI - DO NOT MODIFY BY HAND\n//\n//\n//protocol FaradayCommonHandler {\n//\n//    // ---> protocol\n//\n//    func handle(_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Void\n//}\n//\n//extension FaradayCommonHandler {\n//\n//    func handle(_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Void {\n//        if (!defaultHandle(name,arguments,completion)) {\n//            debugPrint(\"Faraday->Warning \\(name) not handle. argument: \\(arguments ?? \"\")\")\n//        }\n//    }\n//\n//    func defaultHandle(_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Bool {\n////        let args = arguments as? Dictionary<String, Any>\n//        // ---> impl\n//        return false\n//    }\n//\n//}\n//\n"
  },
  {
    "path": "example/ios/Runner/Faraday/FaradayNet.swift",
    "content": "import Foundation\n\n//  Created by faraday_cli on 2020-09-24 09:48:07.370618.\n//\n//    ___                   _\n//   / __\\_ _ _ __ __ _  __| | __ _ _   _\n//  / _\\/ _` | '__/ _` |/ _` |/ _` | | | |\n// / / | (_| | | | (_| | (_| | (_| | |_| |\n// \\/   \\__,_|_|  \\__,_|\\__,_|\\__,_|\\__, |\n//                                  |___/\n//\n// GENERATED CODE BY FARADAY CLI - DO NOT MODIFY BY HAND\n\n\n//func flutterNetBridge(_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Void {\n//    \n//    let args = arguments as? [String: Any]\n//    \n//    let method = name.uppercased(); // REQUEST/GET/PUT/POST/DELETE\n//    let query = args?[\"query\"] as? [String: Any]\n//    let body = args?[\"body\"] as? [String: Any]\n//    let additions = args?[\"additions\"]\n//  \n//    completion(FlutterMethodNotImplemented);\n//}\n"
  },
  {
    "path": "example/ios/Runner/Faraday/FaradayRoute.swift",
    "content": "//import Foundation\n//import g_faraday\n\n//  Created by faraday_cli on 2020-09-24 09:48:07.370618.\n//\n//    ___                   _\n//   / __\\_ _ _ __ __ _  __| | __ _ _   _\n//  / _\\/ _` | '__/ _` |/ _` |/ _` | | | |\n// / / | (_| | | | (_| | (_| | (_| | |_| |\n// \\/   \\__,_|_|  \\__,_|\\__,_|\\__,_|\\__, |\n//                                  |___/\n//\n// GENERATED CODE BY FARADAY CLI - DO NOT MODIFY BY HAND\n\n\n//enum FaradayRoute {\n//    // ---> enum\n//\n//    var page: (name: String, arguments: Any?) {\n//        switch self {\n//            // ---> enum_page\n//        }\n//    }\n//}\n//\n//extension Faraday {\n//    \n//    static func createFlutterViewController(route: FaradayRoute, callback:  @escaping (Any?) -> () = { r in debugPrint(\"result don't be used (String(describing: r))\")}) -> FaradayFlutterViewController {\n//        let page = route.page\n//        let vc = FaradayFlutterViewController(page.name, arguments: page.arguments, callback: callback)\n//        return vc\n//    }\n//}\n\n"
  },
  {
    "path": "example/ios/Runner/GeneratedPluginRegistrant.h",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#ifndef GeneratedPluginRegistrant_h\n#define GeneratedPluginRegistrant_h\n\n#import <Flutter/Flutter.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface GeneratedPluginRegistrant : NSObject\n+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry;\n@end\n\nNS_ASSUME_NONNULL_END\n#endif /* GeneratedPluginRegistrant_h */\n"
  },
  {
    "path": "example/ios/Runner/GeneratedPluginRegistrant.m",
    "content": "//\n//  Generated file. Do not edit.\n//\n\n// clang-format off\n\n#import \"GeneratedPluginRegistrant.h\"\n\n#if __has_include(<g_faraday/GFaradayPlugin.h>)\n#import <g_faraday/GFaradayPlugin.h>\n#else\n@import g_faraday;\n#endif\n\n@implementation GeneratedPluginRegistrant\n\n+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {\n  [GFaradayPlugin registerWithRegistrar:[registry registrarForPlugin:@\"GFaradayPlugin\"]];\n}\n\n@end\n"
  },
  {
    "path": "example/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>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>Faraday</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>g_faraday_example</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>100</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>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\t<key>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner/Runner-Bridging-Header.h",
    "content": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/BaseViewController.swift",
    "content": "//\n//  BaseViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/12/8.\n//\n\nimport UIKit\n\nclass BaseViewController: UIViewController {\n  \n    deinit {\n        debugPrint(\"\\(self) deinit\")\n    }\n\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/Flutter2NativeViewController.swift",
    "content": "//\n//  Flutter2NativeViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/26.\n//\n\nimport UIKit\nimport g_faraday\n\nclass Flutter2NativeViewController: BaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        title = \"iOS Native (F2N)\"\n    }\n    \n    @IBAction func touchPop(sender: UIButton) {\n        \n        let r = [\"date\": Date().description]\n        \n        if (fa.isModal) {\n            fa.dismiss(withResult: r, animated: true)\n        } else {\n            navigationController?.fa.popViewController(withResult: r, animated: true)\n        }\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/Flutter2NativeViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"Flutter2NativeViewController\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"view\" destination=\"i5M-Pr-FkT\" id=\"sfx-zR-JGt\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"i5M-Pr-FkT\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S9B-LS-8Vs\">\n                    <rect key=\"frame\" x=\"168.5\" y=\"433\" width=\"77\" height=\"30\"/>\n                    <state key=\"normal\" title=\"带参数返回\"/>\n                    <connections>\n                        <action selector=\"touchPopWithSender:\" destination=\"-1\" eventType=\"touchUpInside\" id=\"8ln-H1-MWU\"/>\n                    </connections>\n                </button>\n            </subviews>\n            <viewLayoutGuide key=\"safeArea\" id=\"fnl-2z-Ty3\"/>\n            <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n            <constraints>\n                <constraint firstItem=\"S9B-LS-8Vs\" firstAttribute=\"centerY\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"centerY\" id=\"50v-r3-Jkf\"/>\n                <constraint firstItem=\"S9B-LS-8Vs\" firstAttribute=\"centerX\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"centerX\" id=\"feU-cE-Ezt\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"139\" y=\"151\"/>\n        </view>\n    </objects>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/Native2FlutterViewController.swift",
    "content": "//\n//  Native2FlutterViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/26.\n//\n\nimport UIKit\nimport g_faraday\n\nclass Native2FlutterViewController: BaseViewController {\n\n    \n    @IBOutlet var label: UILabel!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        // Do any additional setup after loading the view.\n    }\n\n    @IBAction func onTap(sender: UIButton) {\n        \n        let vc = FaradayFlutterViewController(\"native2flutter\") { [weak self] r in\n            self?.label.text = r.debugDescription\n        }\n        \n        navigationController?.pushViewController(vc, animated: true)\n    }\n\n    @IBAction func onTap1(sedner: UIButton) {\n        \n        let vc = FaradayFlutterViewController(\"transparent_flutter\", backgroundClear: true)\n        \n        navigationController?.present(vc, animated: false, completion: nil)\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/Native2FlutterViewController.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\" customClass=\"Native2FlutterViewController\" customModule=\"Runner\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"label\" destination=\"qdK-Hv-HY3\" id=\"CHd-3r-QBL\"/>\n                <outlet property=\"view\" destination=\"i5M-Pr-FkT\" id=\"sfx-zR-JGt\"/>\n            </connections>\n        </placeholder>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view clearsContextBeforeDrawing=\"NO\" contentMode=\"scaleToFill\" id=\"i5M-Pr-FkT\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OtI-19-LQR\">\n                    <rect key=\"frame\" x=\"16\" y=\"368\" width=\"382\" height=\"160.5\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fG4-Qw-ED8\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"382\" height=\"50.5\"/>\n                            <string key=\"text\">使用Route构造一个FaradayViewController 然后push或者present即可\nroute需要在flutter入口处注册</string>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                            <nil key=\"textColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4KC-gW-rLS\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"50.5\" width=\"382\" height=\"30\"/>\n                            <state key=\"normal\" title=\"Open Flutter\"/>\n                            <connections>\n                                <action selector=\"onTapWithSender:\" destination=\"-1\" eventType=\"touchUpInside\" id=\"vg5-ge-xR4\"/>\n                            </connections>\n                        </button>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qdK-Hv-HY3\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"80.5\" width=\"382\" height=\"50\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                            <color key=\"textColor\" systemColor=\"systemRedColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DZc-xX-WNq\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"130.5\" width=\"382\" height=\"30\"/>\n                            <state key=\"normal\" title=\"Open Transparent Flutter Page\"/>\n                            <connections>\n                                <action selector=\"onTap1WithSedner:\" destination=\"-1\" eventType=\"touchUpInside\" id=\"dH6-cl-ft5\"/>\n                            </connections>\n                        </button>\n                    </subviews>\n                </stackView>\n            </subviews>\n            <viewLayoutGuide key=\"safeArea\" id=\"fnl-2z-Ty3\"/>\n            <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n            <constraints>\n                <constraint firstItem=\"OtI-19-LQR\" firstAttribute=\"centerX\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"centerX\" id=\"01N-GL-RRo\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"OtI-19-LQR\" secondAttribute=\"trailing\" constant=\"16\" id=\"E4J-P0-vRq\"/>\n                <constraint firstItem=\"OtI-19-LQR\" firstAttribute=\"centerY\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"centerY\" id=\"Qoj-hy-0W4\"/>\n                <constraint firstItem=\"OtI-19-LQR\" firstAttribute=\"leading\" secondItem=\"i5M-Pr-FkT\" secondAttribute=\"leading\" constant=\"16\" id=\"Uy0-aV-FiE\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"139\" y=\"151\"/>\n        </view>\n    </objects>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n        <systemColor name=\"systemRedColor\">\n            <color red=\"1\" green=\"0.23137254901960785\" blue=\"0.18823529411764706\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/TabContainer/Tab1ViewController.swift",
    "content": "//\n//  Tab1ViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/27.\n//\n\nimport UIKit\nimport g_faraday\n\nclass Tab1ViewController: BaseViewController, FaradayNavigationBarHiddenProtocol {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        navigationController?.setNavigationBarHidden(true, animated: true)\n\n        let vc = FaradayFlutterViewController(\"tab1\")\n        \n        vc.willMove(toParent: self)\n        addChild(vc)\n        view.addSubview(vc.view)\n        vc.didMove(toParent: self)\n        \n        vc.view.frame = view.frame;\n        vc.view.autoresizingMask = [.flexibleWidth, .flexibleWidth]\n    }\n    \n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/TabContainer/Tab2ViewController.swift",
    "content": "//\n//  Tab2ViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/27.\n//\n\nimport UIKit\nimport g_faraday\n\nclass Tab2ViewController: BaseViewController, FaradayNavigationBarHiddenProtocol {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        navigationController?.setNavigationBarHidden(true, animated: true)\n        \n        let vc = FaradayFlutterViewController(\"home\")\n        \n        vc.willMove(toParent: self)\n        addChild(vc)\n        view.addSubview(vc.view)\n        vc.didMove(toParent: self)\n        \n        vc.view.frame = view.frame;\n        vc.view.autoresizingMask = [.flexibleWidth, .flexibleWidth]\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/TabContainer/TabContainer.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"Eqs-I6-01B\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Tab1-->\n        <scene sceneID=\"Dko-vg-2mt\">\n            <objects>\n                <viewController id=\"F2W-W8-1fC\" customClass=\"Tab1ViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"js5-Dp-eFw\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"lc9-5Y-y3c\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"Tab1\" id=\"Qfw-q5-ik7\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"00L-90-5dy\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"341\" y=\"-388\"/>\n        </scene>\n        <!--Item-->\n        <scene sceneID=\"oMR-Mc-lkX\">\n            <objects>\n                <navigationController id=\"AEI-hP-wP8\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Item\" id=\"aEr-Rb-mhl\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"Tp7-jF-xEO\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"V2p-fx-wjC\" kind=\"relationship\" relationship=\"rootViewController\" id=\"Jen-0Q-9cn\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"r0j-Rm-ZuI\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-520\" y=\"1246\"/>\n        </scene>\n        <!--Tab2-->\n        <scene sceneID=\"G9m-ZO-etY\">\n            <objects>\n                <viewController id=\"AcI-HD-kIa\" customClass=\"Tab2ViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"75N-dT-Kjj\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"cJ6-4C-UJX\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                    </view>\n                    <tabBarItem key=\"tabBarItem\" title=\"Tab2\" id=\"kcV-C8-foV\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"4bC-QN-eab\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"342\" y=\"306\"/>\n        </scene>\n        <!--NativeContainer-->\n        <scene sceneID=\"5V5-1V-6ud\">\n            <objects>\n                <tableViewController title=\"NativeContainer\" id=\"V2p-fx-wjC\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"-1\" estimatedRowHeight=\"-1\" sectionHeaderHeight=\"28\" sectionFooterHeight=\"28\" id=\"hKb-mn-U7C\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <sections>\n                            <tableViewSection id=\"ia2-4l-ev2\">\n                                <cells>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" textLabel=\"PMj-mT-jKD\" style=\"IBUITableViewCellStyleDefault\" id=\"aJj-p9-Lf6\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"414\" height=\"43.5\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"aJj-p9-Lf6\" id=\"iT4-Vy-P5O\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" insetsLayoutMarginsFromSafeArea=\"NO\" text=\"This\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"PMj-mT-jKD\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"374\" height=\"43.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" textLabel=\"Jhi-li-aKG\" style=\"IBUITableViewCellStyleDefault\" id=\"lQv-qQ-FlI\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"71.5\" width=\"414\" height=\"43.5\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"lQv-qQ-FlI\" id=\"gQl-M4-OGB\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" insetsLayoutMarginsFromSafeArea=\"NO\" text=\"is\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Jhi-li-aKG\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"374\" height=\"43.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell clipsSubviews=\"YES\" contentMode=\"scaleToFill\" preservesSuperviewLayoutMargins=\"YES\" selectionStyle=\"default\" indentationWidth=\"10\" textLabel=\"dgt-nt-dsU\" style=\"IBUITableViewCellStyleDefault\" id=\"fot-4O-9K5\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"115\" width=\"414\" height=\"43.5\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" preservesSuperviewLayoutMargins=\"YES\" insetsLayoutMarginsFromSafeArea=\"NO\" tableViewCell=\"fot-4O-9K5\" id=\"eB1-oe-CxG\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.5\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" insetsLayoutMarginsFromSafeArea=\"NO\" text=\"Native ViewController\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"dgt-nt-dsU\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"374\" height=\"43.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"V2p-fx-wjC\" id=\"aRR-ap-zCf\"/>\n                            <outlet property=\"delegate\" destination=\"V2p-fx-wjC\" id=\"YIC-Wr-n7V\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Native Container\" id=\"hD3-nS-usF\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"cRq-aI-ebM\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"168\" y=\"1246\"/>\n        </scene>\n        <!--Tab Bar Controller-->\n        <scene sceneID=\"LhB-01-bnO\">\n            <objects>\n                <tabBarController id=\"Eqs-I6-01B\" sceneMemberID=\"viewController\">\n                    <tabBar key=\"tabBar\" contentMode=\"scaleToFill\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"tPB-bz-8M3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"49\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n                    </tabBar>\n                    <connections>\n                        <segue destination=\"F2W-W8-1fC\" kind=\"relationship\" relationship=\"viewControllers\" id=\"y6M-nH-fCQ\"/>\n                        <segue destination=\"AEI-hP-wP8\" kind=\"relationship\" relationship=\"viewControllers\" id=\"wGX-co-KaJ\"/>\n                        <segue destination=\"AcI-HD-kIa\" kind=\"relationship\" relationship=\"viewControllers\" id=\"AMZ-eN-jAR\"/>\n                        <segue destination=\"a1s-VC-uIo\" kind=\"relationship\" relationship=\"viewControllers\" id=\"ehz-JC-CUO\"/>\n                    </connections>\n                </tabBarController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Avq-kx-wAQ\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-520\" y=\"225\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"lw1-x6-yGo\">\n            <objects>\n                <viewController id=\"98n-h0-2sL\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"5Br-hb-83L\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <stackView opaque=\"NO\" contentMode=\"scaleToFill\" axis=\"vertical\" distribution=\"fillEqually\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KT3-Fk-a2q\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"88\" width=\"414\" height=\"725\"/>\n                                <subviews>\n                                    <containerView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jsD-UQ-b3a\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"362.5\"/>\n                                        <connections>\n                                            <segue destination=\"keq-y0-8uV\" kind=\"embed\" id=\"8Cf-YB-ObU\"/>\n                                        </connections>\n                                    </containerView>\n                                    <containerView opaque=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iM4-Cg-TkV\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"362.5\" width=\"414\" height=\"362.5\"/>\n                                        <connections>\n                                            <segue destination=\"wd2-dH-UL5\" kind=\"embed\" id=\"Knx-SY-gVe\"/>\n                                        </connections>\n                                    </containerView>\n                                </subviews>\n                            </stackView>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"Q9v-hL-Oos\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"KT3-Fk-a2q\" firstAttribute=\"leading\" secondItem=\"Q9v-hL-Oos\" secondAttribute=\"leading\" id=\"2wn-eS-c09\"/>\n                            <constraint firstItem=\"KT3-Fk-a2q\" firstAttribute=\"top\" secondItem=\"Q9v-hL-Oos\" secondAttribute=\"top\" id=\"FgK-nm-Di6\"/>\n                            <constraint firstItem=\"Q9v-hL-Oos\" firstAttribute=\"trailing\" secondItem=\"KT3-Fk-a2q\" secondAttribute=\"trailing\" id=\"QRV-wp-NLo\"/>\n                            <constraint firstItem=\"Q9v-hL-Oos\" firstAttribute=\"bottom\" secondItem=\"KT3-Fk-a2q\" secondAttribute=\"bottom\" id=\"nME-zr-LZG\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" id=\"PvR-du-cNf\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"OmC-b8-55D\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1922\" y=\"99\"/>\n        </scene>\n        <!--Tab Split View Controller-->\n        <scene sceneID=\"tKJ-sN-k8y\">\n            <objects>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"VMJ-P2-592\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n                <viewController id=\"keq-y0-8uV\" customClass=\"TabSplitViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"5R4-1u-RPM\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"362.5\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"3CI-Kl-CH3\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                    </view>\n                </viewController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2739\" y=\"-207\"/>\n        </scene>\n        <!--Tab Split View Controller-->\n        <scene sceneID=\"hWn-2r-CQ0\">\n            <objects>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"sWn-gZ-YJU\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n                <viewController id=\"wd2-dH-UL5\" customClass=\"TabSplitViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"7Gg-UC-cbg\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"362.5\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <viewLayoutGuide key=\"safeArea\" id=\"3s5-fq-554\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                    </view>\n                </viewController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2739\" y=\"336\"/>\n        </scene>\n        <!--Item-->\n        <scene sceneID=\"p1i-Po-T0f\">\n            <objects>\n                <navigationController id=\"a1s-VC-uIo\" sceneMemberID=\"viewController\">\n                    <tabBarItem key=\"tabBarItem\" title=\"Item\" id=\"E01-3H-bgA\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"AcF-Pd-ee7\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"98n-h0-2sL\" kind=\"relationship\" relationship=\"rootViewController\" id=\"Bmk-qg-L7C\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"LBk-mi-acu\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1091\" y=\"98\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Basic/TabContainer/TabSplitViewController.swift",
    "content": "//\n//  TabSplitViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/12/25.\n//\n\nimport Foundation\nimport g_faraday\n\nclass TabSplitViewController: UIViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        navigationController?.setNavigationBarHidden(true, animated: true)\n        \n        let vc = FaradayFlutterViewController(\"home\")\n        \n        vc.willMove(toParent: self)\n        addChild(vc)\n        view.addSubview(vc.view)\n        vc.didMove(toParent: self)\n        \n        vc.view.frame = view.frame;\n        vc.view.autoresizingMask = [.flexibleWidth, .flexibleWidth]\n    }\n    \n    override func viewDidAppear(_ animated: Bool) {\n        super.viewDidAppear(animated)\n        if let index = parent?.children.firstIndex(of: self), index == 0 {\n            if let vc = children.first as? FaradayFlutterViewController {\n                Faraday.refreshViewController(vc)\n            }\n        }\n    }\n    \n}\n\n\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/MainavigationViewController.swift",
    "content": "//\n//  MainavigationViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/26.\n//\n\nimport UIKit\nimport g_faraday\n\nclass MainavigationViewController: UINavigationController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        setNavigationBarHidden(true, animated: false)\n        setViewControllers([HomeFlutterViewController()], animated: false)\n        \n        //\n        \n        NotificationCenter.default.addObserver(forName: .init(rawValue: \"GlobalNotification\"), object: nil, queue: OperationQueue.main) { [weak self] _ in\n            \n            let vc = UIAlertController(title: \"收到 GlobalNotification\", message: \"点击确定5s后发送通知到Flutter <这是一个Native的UIAlertController>\", preferredStyle: .alert)\n            \n            vc.addAction(UIAlertAction(title: \"取消\", style: .destructive, handler: nil))\n            \n            vc.addAction(UIAlertAction(title: \"确定\", style: .default, handler: { _ in\n                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {\n                    NotificationCenter.fa.post(name: \"NotificationFromNative\", object: \"from ios native systemVersion: \\(UIDevice.current.systemVersion)\")\n                }\n            }))\n            \n            self?.present(vc, animated: true, completion: nil)\n        }\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Others/NeedNavigationBarViewController.swift",
    "content": "//\n//  NeedNavigationBarViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/27.\n//\n\nimport UIKit\n\nclass NeedNavigationBarViewController: BaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        navigationController?.setNavigationBarHidden(false, animated: true)\n    }\n\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Others/NoNavigationBarViewController.swift",
    "content": "//\n//  NoNavigationBarViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/27.\n//\n\nimport UIKit\nimport g_faraday\n\nclass NoNavigationBarViewController: BaseViewController, FaradayNavigationBarHiddenProtocol {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        navigationController?.setNavigationBarHidden(true, animated: false)\n    }\n    \n    \n    @IBAction func onTabBack(sender: UIButton) {\n        \n        navigationController?.popViewController(animated: true)\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Others/Other.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17506\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"lei-SI-Q7E\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17505\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Need Navigation Bar View Controller-->\n        <scene sceneID=\"um8-5F-asF\">\n            <objects>\n                <viewController id=\"lei-SI-Q7E\" customClass=\"NeedNavigationBarViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"sPk-ex-hmx\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"我是Native页面，我需要navigation bar\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0pO-y7-eHf\">\n                                <rect key=\"frame\" x=\"59.5\" y=\"437.5\" width=\"295\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"textColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UdK-V8-15z\">\n                                <rect key=\"frame\" x=\"168\" y=\"453.5\" width=\"78\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GOTO Next\"/>\n                                <connections>\n                                    <segue destination=\"eyc-Xn-hbF\" kind=\"show\" id=\"AeM-wJ-zKh\"/>\n                                </connections>\n                            </button>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"FlutterViewController 自动隐藏navigationbar\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ivw-Pf-YCa\">\n                                <rect key=\"frame\" x=\"38\" y=\"413\" width=\"338\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"textColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"UY2-1c-Ny8\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"UdK-V8-15z\" firstAttribute=\"firstBaseline\" secondItem=\"0pO-y7-eHf\" secondAttribute=\"baseline\" constant=\"20\" symbolType=\"layoutAnchor\" id=\"3yt-gd-b4Y\"/>\n                            <constraint firstItem=\"0pO-y7-eHf\" firstAttribute=\"centerX\" secondItem=\"sPk-ex-hmx\" secondAttribute=\"centerX\" id=\"61r-HP-Mwp\"/>\n                            <constraint firstItem=\"Ivw-Pf-YCa\" firstAttribute=\"centerX\" secondItem=\"sPk-ex-hmx\" secondAttribute=\"centerX\" id=\"Y7p-HX-Sq9\"/>\n                            <constraint firstItem=\"0pO-y7-eHf\" firstAttribute=\"firstBaseline\" secondItem=\"Ivw-Pf-YCa\" secondAttribute=\"baseline\" constant=\"24\" symbolType=\"layoutAnchor\" id=\"lB0-hR-PMs\"/>\n                            <constraint firstItem=\"0pO-y7-eHf\" firstAttribute=\"centerY\" secondItem=\"sPk-ex-hmx\" secondAttribute=\"centerY\" id=\"pAe-mW-VJP\"/>\n                            <constraint firstItem=\"UdK-V8-15z\" firstAttribute=\"centerX\" secondItem=\"sPk-ex-hmx\" secondAttribute=\"centerX\" id=\"uFJ-CC-7Pn\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"TXK-r7-d4e\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-530\" y=\"126\"/>\n        </scene>\n        <!--No Navigation Bar View Controller-->\n        <scene sceneID=\"9xy-xT-DRg\">\n            <objects>\n                <viewController id=\"eyc-Xn-hbF\" customClass=\"NoNavigationBarViewController\" customModule=\"Runner\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"fNs-PN-y4i\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"842\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"我也是原生页面， 但是我不需要navigation bar\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uD5-Sz-Xe2\">\n                                <rect key=\"frame\" x=\"29.5\" y=\"410.5\" width=\"355\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"textColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mai-Tc-o0a\">\n                                <rect key=\"frame\" x=\"187\" y=\"426.5\" width=\"40\" height=\"30\"/>\n                                <state key=\"normal\" title=\"BACK\"/>\n                                <connections>\n                                    <action selector=\"onTabBackWithSender:\" destination=\"eyc-Xn-hbF\" eventType=\"touchUpInside\" id=\"L4H-2h-cfS\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <viewLayoutGuide key=\"safeArea\" id=\"YRq-8C-fg8\"/>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"uD5-Sz-Xe2\" firstAttribute=\"centerY\" secondItem=\"fNs-PN-y4i\" secondAttribute=\"centerY\" id=\"1XU-qq-I9z\"/>\n                            <constraint firstItem=\"mai-Tc-o0a\" firstAttribute=\"firstBaseline\" secondItem=\"uD5-Sz-Xe2\" secondAttribute=\"baseline\" constant=\"20\" symbolType=\"layoutAnchor\" id=\"QwX-JJ-TOQ\"/>\n                            <constraint firstItem=\"mai-Tc-o0a\" firstAttribute=\"centerX\" secondItem=\"fNs-PN-y4i\" secondAttribute=\"centerX\" id=\"Ufx-bd-O0m\"/>\n                            <constraint firstItem=\"uD5-Sz-Xe2\" firstAttribute=\"centerX\" secondItem=\"fNs-PN-y4i\" secondAttribute=\"centerX\" id=\"XdE-zf-bAE\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" id=\"HKp-kt-pqr\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"e7A-MN-SDa\" userLabel=\"First Responder\" customClass=\"UIResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"261\" y=\"126\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Splash/HomeFlutterViewController.swift",
    "content": "//\n//  HomeFlutterViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/11/27.\n//\n\nimport UIKit\nimport g_faraday\n\nclass HomeFlutterViewController: FaradayFlutterViewController {\n    \n    init() {\n        super.init(\"home\", arguments: nil, backgroundClear: false, engine: nil, callback: nil)\n        navigationController?.setNavigationBarHidden(true, animated: false)\n        \n//        let v = UIView()\n//        v.backgroundColor = .red\n//        v.frame = UIScreen.main.bounds\n//\n//        let imageView = UIImageView(image: UIImage(named: \"logo\"))\n//        v.addSubview(imageView)\n//        imageView.center = view.center\n//        https://github.com/flutter/flutter/issues/37818\n//        flutter engine 暂时有bug， 不推荐设置\n//        splashScreenView = v\n        \n        // 直接将 launchScreen.storyboard 中的view 作为 splashView\n        loadDefaultSplashScreenView()\n\n    }\n    \n    required init(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n       \n//    override func loadDefaultSplashScreenView() -> Bool {\n//        return false\n//    }\n    \n}\n"
  },
  {
    "path": "example/ios/Runner/ViewControllers/Tab0ViewController.swift",
    "content": "//\n//  Tab0ViewController.swift\n//  Runner\n//\n//  Created by gix on 2020/9/4.\n//\n\nimport UIKit\nimport g_faraday\n\nclass Flutter1ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        let vc = FPage.tab.flutterViewController() { _ in\n            \n        }\n        \n        vc.willMove(toParent: self)\n        addChild(vc)\n        view.addSubview(vc.view)\n        vc.didMove(toParent: self)\n        \n        vc.view.frame = view.frame;\n        vc.view.autoresizingMask = [.flexibleWidth, .flexibleWidth]\n    }\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        navigationController?.setNavigationBarHidden(true, animated: false)\n    }\n}\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };\n\t\t2B7C7E45D5FD3A950621793C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 44332D89126D63036F2EF2EC /* Pods_Runner.framework */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t5B164C79257F2E69002BAED0 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B164C78257F2E69002BAED0 /* BaseViewController.swift */; };\n\t\t5B3F2C6B251992270091B7E5 /* FaradayCommon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3F2C6A251992270091B7E5 /* FaradayCommon.swift */; };\n\t\t5B3F2C6D251992310091B7E5 /* FaradayRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3F2C6C251992310091B7E5 /* FaradayRoute.swift */; };\n\t\t5B3F2C6F251992E80091B7E5 /* FaradayNet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B3F2C6E251992E80091B7E5 /* FaradayNet.swift */; };\n\t\t5B42C2B5256F3C300069684B /* MainavigationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2B4256F3C300069684B /* MainavigationViewController.swift */; };\n\t\t5B42C2BB256F56470069684B /* Flutter2NativeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2B9256F56470069684B /* Flutter2NativeViewController.swift */; };\n\t\t5B42C2BC256F56470069684B /* Flutter2NativeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B42C2BA256F56470069684B /* Flutter2NativeViewController.xib */; };\n\t\t5B42C2CB256F99370069684B /* Native2FlutterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2C9256F99370069684B /* Native2FlutterViewController.swift */; };\n\t\t5B42C2CC256F99370069684B /* Native2FlutterViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5B42C2CA256F99370069684B /* Native2FlutterViewController.xib */; };\n\t\t5B42C2D62570DA470069684B /* HomeFlutterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2D52570DA470069684B /* HomeFlutterViewController.swift */; };\n\t\t5B42C2D92570E1360069684B /* TabContainer.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5B42C2D82570E1360069684B /* TabContainer.storyboard */; };\n\t\t5B42C2DB2570E23E0069684B /* Tab1ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2DA2570E23E0069684B /* Tab1ViewController.swift */; };\n\t\t5B42C2DD2570E2480069684B /* Tab2ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2DC2570E2480069684B /* Tab2ViewController.swift */; };\n\t\t5B42C2E92570FC4B0069684B /* NeedNavigationBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2E72570FC4B0069684B /* NeedNavigationBarViewController.swift */; };\n\t\t5B42C2ED2570FC5C0069684B /* NoNavigationBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B42C2EB2570FC5C0069684B /* NoNavigationBarViewController.swift */; };\n\t\t5B42C2F02570FCD40069684B /* Other.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5B42C2EF2570FCD40069684B /* Other.storyboard */; };\n\t\t5B76432F2595CBFA00B050D3 /* TabSplitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B76432E2595CBFA00B050D3 /* TabSplitViewController.swift */; };\n\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };\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/* 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);\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\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t44332D89126D63036F2EF2EC /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5501EE160CBE2CB443C7C5D9 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5B164C78257F2E69002BAED0 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B3F2C6A251992270091B7E5 /* FaradayCommon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaradayCommon.swift; sourceTree = \"<group>\"; };\n\t\t5B3F2C6C251992310091B7E5 /* FaradayRoute.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaradayRoute.swift; sourceTree = \"<group>\"; };\n\t\t5B3F2C6E251992E80091B7E5 /* FaradayNet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaradayNet.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2B4256F3C300069684B /* MainavigationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainavigationViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2B9256F56470069684B /* Flutter2NativeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Flutter2NativeViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2BA256F56470069684B /* Flutter2NativeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Flutter2NativeViewController.xib; sourceTree = \"<group>\"; };\n\t\t5B42C2C9256F99370069684B /* Native2FlutterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Native2FlutterViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2CA256F99370069684B /* Native2FlutterViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Native2FlutterViewController.xib; sourceTree = \"<group>\"; };\n\t\t5B42C2D52570DA470069684B /* HomeFlutterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeFlutterViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2D82570E1360069684B /* TabContainer.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = TabContainer.storyboard; sourceTree = \"<group>\"; };\n\t\t5B42C2DA2570E23E0069684B /* Tab1ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tab1ViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2DC2570E2480069684B /* Tab2ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tab2ViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2E72570FC4B0069684B /* NeedNavigationBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NeedNavigationBarViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2EB2570FC5C0069684B /* NoNavigationBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoNavigationBarViewController.swift; sourceTree = \"<group>\"; };\n\t\t5B42C2EF2570FCD40069684B /* Other.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Other.storyboard; sourceTree = \"<group>\"; };\n\t\t5B76432E2595CBFA00B050D3 /* TabSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabSplitViewController.swift; sourceTree = \"<group>\"; };\n\t\t6F485E225566A3B45EAA9BBB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\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\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\tD4355FBCE6FFD4A4BAB08AEC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\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\t2B7C7E45D5FD3A950621793C /* 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\t17532E583AA1476B8A97DC30 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t44332D89126D63036F2EF2EC /* Pods_Runner.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B3F2C69251992170091B7E5 /* Faraday */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B3F2C6A251992270091B7E5 /* FaradayCommon.swift */,\n\t\t\t\t5B3F2C6C251992310091B7E5 /* FaradayRoute.swift */,\n\t\t\t\t5B3F2C6E251992E80091B7E5 /* FaradayNet.swift */,\n\t\t\t);\n\t\t\tpath = Faraday;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B42C2B3256E59110069684B /* Splash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B42C2D52570DA470069684B /* HomeFlutterViewController.swift */,\n\t\t\t);\n\t\t\tpath = Splash;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B42C2B6256F56110069684B /* Basic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B42C2D72570E1150069684B /* TabContainer */,\n\t\t\t\t5B42C2B9256F56470069684B /* Flutter2NativeViewController.swift */,\n\t\t\t\t5B42C2BA256F56470069684B /* Flutter2NativeViewController.xib */,\n\t\t\t\t5B42C2C9256F99370069684B /* Native2FlutterViewController.swift */,\n\t\t\t\t5B42C2CA256F99370069684B /* Native2FlutterViewController.xib */,\n\t\t\t);\n\t\t\tpath = Basic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B42C2D72570E1150069684B /* TabContainer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B42C2D82570E1360069684B /* TabContainer.storyboard */,\n\t\t\t\t5B42C2DA2570E23E0069684B /* Tab1ViewController.swift */,\n\t\t\t\t5B42C2DC2570E2480069684B /* Tab2ViewController.swift */,\n\t\t\t\t5B76432E2595CBFA00B050D3 /* TabSplitViewController.swift */,\n\t\t\t);\n\t\t\tpath = TabContainer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B42C2E62570FC1C0069684B /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B42C2E72570FC4B0069684B /* NeedNavigationBarViewController.swift */,\n\t\t\t\t5B42C2EB2570FC5C0069684B /* NoNavigationBarViewController.swift */,\n\t\t\t\t5B42C2EF2570FCD40069684B /* Other.storyboard */,\n\t\t\t);\n\t\t\tpath = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5B5982F124FF41890036EF15 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B42C2E62570FC1C0069684B /* Others */,\n\t\t\t\t5B42C2B6256F56110069684B /* Basic */,\n\t\t\t\t5B42C2B3256E59110069684B /* Splash */,\n\t\t\t\t5B42C2B4256F3C300069684B /* MainavigationViewController.swift */,\n\t\t\t\t5B164C78257F2E69002BAED0 /* BaseViewController.swift */,\n\t\t\t);\n\t\t\tpath = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7615AAC4F94CC4239DFB3727 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD4355FBCE6FFD4A4BAB08AEC /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t6F485E225566A3B45EAA9BBB /* Pods-Runner.release.xcconfig */,\n\t\t\t\t5501EE160CBE2CB443C7C5D9 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = 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\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\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\t7615AAC4F94CC4239DFB3727 /* Pods */,\n\t\t\t\t17532E583AA1476B8A97DC30 /* 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\t74858FAE1ED2DC5600515810 /* AppDelegate.swift */,\n\t\t\t\t5B5982F124FF41890036EF15 /* ViewControllers */,\n\t\t\t\t5B3F2C69251992170091B7E5 /* Faraday */,\n\t\t\t\t97C146FA1CF9000F007C117D /* Main.storyboard */,\n\t\t\t\t97C146FD1CF9000F007C117D /* Assets.xcassets */,\n\t\t\t\t97C147021CF9000F007C117D /* Info.plist */,\n\t\t\t\t97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,\n\t\t\t\t1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,\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/* 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\t73800F583CEB2310136CDCB1 /* [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\t2C53630057E8A4E06A5029F0 /* [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 = 1300;\n\t\t\t\tORGANIZATIONNAME = \"\";\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 = 1100;\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 9.3\";\n\t\t\tdevelopmentRegion = en;\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\t5B42C2D92570E1360069684B /* TabContainer.storyboard in Resources */,\n\t\t\t\t97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t5B42C2F02570FCD40069684B /* Other.storyboard in Resources */,\n\t\t\t\t5B42C2BC256F56470069684B /* Flutter2NativeViewController.xib in Resources */,\n\t\t\t\t5B42C2CC256F99370069684B /* Native2FlutterViewController.xib in Resources */,\n\t\t\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets 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\t2C53630057E8A4E06A5029F0 /* [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\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\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\\\" embed_and_thin\";\n\t\t};\n\t\t73800F583CEB2310136CDCB1 /* [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\tinputFileListPaths = (\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\toutputFileListPaths = (\n\t\t\t);\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\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\";\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\t5B42C2E92570FC4B0069684B /* NeedNavigationBarViewController.swift in Sources */,\n\t\t\t\t5B42C2DB2570E23E0069684B /* Tab1ViewController.swift in Sources */,\n\t\t\t\t5B42C2ED2570FC5C0069684B /* NoNavigationBarViewController.swift in Sources */,\n\t\t\t\t74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,\n\t\t\t\t5B76432F2595CBFA00B050D3 /* TabSplitViewController.swift in Sources */,\n\t\t\t\t1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,\n\t\t\t\t5B164C79257F2E69002BAED0 /* BaseViewController.swift in Sources */,\n\t\t\t\t5B3F2C6F251992E80091B7E5 /* FaradayNet.swift in Sources */,\n\t\t\t\t5B42C2DD2570E2480069684B /* Tab2ViewController.swift in Sources */,\n\t\t\t\t5B42C2CB256F99370069684B /* Native2FlutterViewController.swift in Sources */,\n\t\t\t\t5B42C2BB256F56470069684B /* Flutter2NativeViewController.swift in Sources */,\n\t\t\t\t5B3F2C6D251992310091B7E5 /* FaradayRoute.swift in Sources */,\n\t\t\t\t5B42C2B5256F3C300069684B /* MainavigationViewController.swift in Sources */,\n\t\t\t\t5B42C2D62570DA470069684B /* HomeFlutterViewController.swift in Sources */,\n\t\t\t\t5B3F2C6B251992270091B7E5 /* FaradayCommon.swift 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\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = X7S38PP265;\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.yuxiaor.flutter.gFaradayExample;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.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\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\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\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = X7S38PP265;\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.yuxiaor.flutter.gFaradayExample;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\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\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\n\t\t\t\tDEVELOPMENT_TEAM = X7S38PP265;\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.yuxiaor.flutter.gFaradayExample;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\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\t249021D3217E4FDB00AE95B9 /* Profile */,\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\t249021D4217E4FDB00AE95B9 /* Profile */,\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": "example/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 = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "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>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\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      shouldUseLaunchSchemeArgsEnv = \"YES\">\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      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\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   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\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": "example/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": "example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "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>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example/lib/fluro_router.dart",
    "content": "// // ignore: import_of_legacy_library_into_null_safe\n// import 'package:fluro/fluro.dart';\n// import 'package:g_faraday/g_faraday.dart';\n\n// import 'src/pages/features/basic/pages/flutter_to_flutter.dart';\n// import 'src/pages/features/basic/pages/native_to_flutter.dart';\n// import 'src/pages/features/basic/pages/tab_page.dart';\n// import 'src/pages/features/basic/pages/transparent_page.dart';\n// import 'src/pages/home_page.dart';\n\n// final router = FluroRouter();\n\n// void defineRoutes(FluroRouter router) {\n//   router.define('home',\n//       handler: Handler(handlerFunc: (context, params) => HomePage(params)));\n//   router.define('native2flutter',\n//       handler: Handler(\n//           handlerFunc: (context, params) => Native2FlutterPage(params)));\n//   router.define('flutter2flutter',\n//       handler: Handler(\n//           handlerFunc: (context, params) =>\n//               Flutter2Flutter(index: JSON(params)['index'].integer)));\n//   router.define('tab1',\n//       handler: Handler(handlerFunc: (context, params) => TabPage()));\n//   router.define('transparent_flutter',\n//       handler: Handler(handlerFunc: (context, params) => TransparentPage()));\n// }\n"
  },
  {
    "path": "example/lib/main.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter_localizations/flutter_localizations.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nimport 'src/pages/features/basic/pages/flutter_to_flutter.dart';\nimport 'src/pages/features/basic/pages/native_to_flutter.dart';\nimport 'src/pages/features/basic/pages/tab_page.dart';\nimport 'src/pages/features/basic/pages/transparent_page.dart';\nimport 'src/pages/home_page.dart';\nimport 'src/utils/observer.dart';\nimport 'src/utils/simple_localizations.dart';\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatefulWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  // ignore: library_private_types_in_public_api\n  _MyAppState createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n  Map<String, RouteFactory> routes = {\n    'home': (settings) => CupertinoPageRoute(\n        builder: (context) => HomePage(settings.arguments), settings: settings),\n    'native2flutter': (settings) => CupertinoPageRoute(\n        builder: (context) => Native2FlutterPage(settings.arguments),\n        settings: settings),\n    'flutter2flutter': (settings) => CupertinoPageRoute(\n        builder: (context) => Flutter2Flutter(index: settings.toJson.index),\n        settings: settings),\n    'tab1': (settings) => CupertinoPageRoute(\n        builder: (context) => const TabPage(), settings: settings),\n    'transparent_flutter': (settings) => CupertinoPageRoute(\n          builder: (context) => const TransparentPage(),\n          settings: settings,\n        )\n  };\n\n  @override\n  Widget build(BuildContext context) {\n    const color = Color.fromARGB(255, 6, 210, 116);\n\n    final route = faraday.wrapper(\n      (settings) => routes[settings.name]?.call(settings),\n      observers: [DemoObserver()],\n      errorPage: _buildErrorPage,\n      // switchPageAnimation: (currentRoute) {\n      //   if (currentRoute['route'] == '') {\n      //     return ((context, child) => AnimatedSwitcher(\n      //           duration: Duration(seconds: 1),\n      //           child: child,\n      //           transitionBuilder: (child, animation) => RotationTransition(\n      //             turns: animation,\n      //             child: child,\n      //           ),\n      //         ));\n      //   }\n      //   return null;\n      // },\n      // flutter 自定义过渡页背景\n      // nativeContainerBackgroundColorProvider: (context, {route}) =>\n      //     CupertinoColors.secondarySystemBackground,\n    );\n\n    final cupertinoApp = CupertinoApp(\n      localizationsDelegates: [\n        S.delegate,\n        DefaultCupertinoLocalizations.delegate,\n        GlobalCupertinoLocalizations.delegate\n      ],\n      supportedLocales: const [\n        Locale('en', ''),\n        Locale.fromSubtags(languageCode: 'zh')\n      ],\n      theme: const CupertinoThemeData(primaryColor: color),\n      debugShowCheckedModeBanner: false,\n      onGenerateRoute: (_) => route,\n    );\n\n    return Directionality(\n      textDirection: TextDirection.ltr,\n      child: Banner(\n        location: BannerLocation.topEnd,\n        message: 'faraday',\n        color: color,\n        textStyle: const TextStyle(\n          color: CupertinoColors.white,\n          fontSize: 12 * 0.85,\n          fontWeight: FontWeight.w900,\n          height: 1.0,\n        ),\n        child: cupertinoApp,\n      ),\n    );\n  }\n\n  ///\n  ///出错页面\n  ///\n  Widget _buildErrorPage(BuildContext context) {\n    return GestureDetector(\n      onTap: () => faraday.refresh(), //刷新\n      behavior: HitTestBehavior.opaque,\n      child: Container(\n        color: CupertinoColors.lightBackgroundGray,\n        padding: const EdgeInsets.only(left: 15.0, right: 15.0),\n        alignment: Alignment.center,\n        child: const Text.rich(\n          TextSpan(children: [\n            TextSpan(\n              text: '404',\n              style: TextStyle(\n                color: CupertinoColors.systemRed,\n                fontSize: 64.0,\n                fontWeight: FontWeight.bold,\n              ),\n            ),\n            TextSpan(\n              text: '\\n出错了,点击刷新',\n              style: TextStyle(\n                fontSize: 16.0,\n                color: CupertinoColors.placeholderText,\n              ),\n            ),\n          ]),\n          textAlign: TextAlign.center,\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/main_fluro.dart",
    "content": "// import 'package:flutter/cupertino.dart';\n// import 'package:g_faraday/g_faraday.dart';\n\n// import 'fluro_router.dart';\n// import 'src/utils/simple_localizations.dart';\n\n// void main(List<String> args) {\n//   defineRoutes(router);\n//   runApp(MyApp());\n// }\n\n// class MyApp extends StatefulWidget {\n//   @override\n//   _MyAppState createState() => _MyAppState();\n// }\n\n// class _MyAppState extends State<MyApp> {\n//   @override\n//   Widget build(BuildContext context) {\n//     final color = Color.fromARGB(255, 6, 210, 116);\n\n//     final route = faraday.wrapper(\n//       router.generator,\n//       switchPageAnimation: (currentRoute) {\n//         if (currentRoute['route'] == '') {\n//           return ((context, child) => AnimatedSwitcher(\n//                 duration: Duration(seconds: 1),\n//                 child: child,\n//                 transitionBuilder: (child, animation) => RotationTransition(\n//                   turns: animation,\n//                   child: child,\n//                 ),\n//               ));\n//         }\n//         return null;\n//       },\n//       // flutter 自定义过渡页背景\n//       nativeContainerBackgroundColorProvider: (context, {route}) =>\n//           CupertinoColors.secondarySystemBackground,\n//     );\n\n//     final cupertinoApp = CupertinoApp(\n//       localizationsDelegates: [\n//         S.delegate,\n//         GlobalCupertinoLocalizations.delegate,\n//         GlobalWidgetsLocalizations.delegate\n//       ],\n//       supportedLocales: [\n//         Locale('en', ''),\n//         Locale.fromSubtags(languageCode: 'zh')\n//       ],\n//       theme: CupertinoThemeData(primaryColor: color),\n//       debugShowCheckedModeBanner: false,\n//       onGenerateRoute: (_) => route,\n//     );\n\n//     return Directionality(\n//       textDirection: TextDirection.ltr,\n//       child: Banner(\n//         location: BannerLocation.topEnd,\n//         message: 'faraday',\n//         color: color,\n//         textStyle: TextStyle(\n//           color: CupertinoColors.white,\n//           fontSize: 12 * 0.85,\n//           fontWeight: FontWeight.w900,\n//           height: 1.0,\n//         ),\n//         child: cupertinoApp,\n//       ),\n//     );\n//   }\n// }\n"
  },
  {
    "path": "example/lib/main_get.dart",
    "content": "// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n// import 'package:g_faraday/g_faraday.dart';\n// import 'package:get/route_manager.dart';\n\n// import 'src/pages/features/basic/pages/flutter_to_flutter.dart';\n// import 'src/pages/features/basic/pages/native_to_flutter.dart';\n// import 'src/pages/features/basic/pages/tab_page.dart';\n// import 'src/pages/features/basic/pages/transparent_page.dart';\n// import 'src/pages/home_page.dart';\n// import 'src/utils/simple_localizations.dart';\n\n// void main() {\n//   runApp(MyApp());\n// }\n\n// class MyApp extends StatefulWidget {\n//   @override\n//   _MyAppState createState() => _MyAppState();\n// }\n\n// class _MyAppState extends State<MyApp> {\n//   Map<String, RouteFactory> routes = {\n//     'home': (settings) => CupertinoPageRoute(\n//      builder: (context) => HomePage(settings.arguments), settings: settings),\n//     'native2flutter': (settings) => CupertinoPageRoute(\n//         builder: (context) => Native2FlutterPage(settings.arguments),\n//         settings: settings),\n//     'flutter2flutter': (settings) => CupertinoPageRoute(\n//         builder: (context) => Flutter2Flutter(index: settings.toJson.index),\n//         settings: settings),\n//     'tab1': (settings) =>\n//      CupertinoPageRoute(builder: (context) => TabPage(), settings: settings),\n//     'transparent_flutter': (settings) => CupertinoPageRoute(\n//           builder: (context) => TransparentPage(),\n//           settings: settings,\n//         )\n//   };\n\n//   @override\n//   Widget build(BuildContext context) {\n//     final color = Color.fromARGB(255, 6, 210, 116);\n\n//     final route = faraday.wrapper(\n//       (settings) {\n//         final f = routes[settings.name!];\n//         if (f == null) return null;\n//         return f(settings);\n//       },\n//       switchPageAnimation: (currentRoute) {\n//         if (currentRoute['route'] == '') {\n//           return ((context, child) => AnimatedSwitcher(\n//                 duration: Duration(seconds: 1),\n//                 child: child,\n//                 transitionBuilder: (child, animation) => RotationTransition(\n//                   turns: animation,\n//                   child: child,\n//                 ),\n//               ));\n//         }\n//         return null;\n//       },\n//       // flutter 自定义过渡页背景\n//       nativeContainerBackgroundColorProvider: (context, {route}) =>\n//           CupertinoColors.secondarySystemBackground,\n//     );\n\n//     final cupertinoApp = GetCupertinoApp(\n//       localizationsDelegates: [\n//         S.delegate,\n//       ],\n//       supportedLocales: [\n//         Locale('en', ''),\n//         Locale.fromSubtags(languageCode: 'zh')\n//       ],\n//       theme: CupertinoThemeData(primaryColor: color),\n//       debugShowCheckedModeBanner: false,\n//       onGenerateRoute: (_) => route,\n//     );\n\n//     return Directionality(\n//       textDirection: TextDirection.ltr,\n//       child: Banner(\n//         location: BannerLocation.topEnd,\n//         message: 'faraday',\n//         color: color,\n//         textStyle: TextStyle(\n//           color: CupertinoColors.white,\n//           fontSize: 12 * 0.85,\n//           fontWeight: FontWeight.w900,\n//           height: 1.0,\n//         ),\n//         child: cupertinoApp,\n//       ),\n//     );\n//   }\n// }\n"
  },
  {
    "path": "example/lib/src/debug/debug.dart",
    "content": "//  Created by faraday_cli on 2020-09-24 09:48:07.370618.\n//\n//    ___                   _\n//   / __\\_ _ _ __ __ _  __| | __ _ _   _\n//  / _\\/ _` | '__/ _` |/ _` |/ _` | | | |\n// / / | (_| | | | (_| | (_| | (_| | |_| |\n// \\/   \\__,_|_|  \\__,_|\\__,_|\\__,_|\\__, |\n//                                  |___/\n//\n// GENERATED CODE BY FARADAY CLI - DO NOT MODIFY BY HAND\n\n\nconst debugVersionMessage = 'faraday';\n"
  },
  {
    "path": "example/lib/src/pages/example_page_scaffold.dart",
    "content": "import 'package:flutter/cupertino.dart';\n\nclass ExamplePageScaffold extends StatefulWidget {\n  final String? title;\n  final List<Widget>? children;\n\n  const ExamplePageScaffold(this.title, {Key? key, this.children})\n      : super(key: key);\n\n  @override\n  _ExamplePageScaffoldState createState() => _ExamplePageScaffoldState();\n}\n\nclass _ExamplePageScaffoldState extends State<ExamplePageScaffold> {\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      navigationBar: CupertinoNavigationBar(\n        middle: Text(widget.title ?? 'NoTitle'),\n      ),\n      child: SafeArea(\n        minimum: const EdgeInsets.all(16),\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: widget.children!,\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/basic.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nimport '../../../utils/simple_localizations.dart';\nimport '../../../widgets/section.dart';\nimport 'pages/flutter_to_flutter.dart';\nimport 'pages/flutter_to_native.dart';\n\nclass Basic extends StatefulWidget {\n  const Basic({Key? key}) : super(key: key);\n\n  @override\n  _BasicState createState() => _BasicState();\n}\n\nclass _BasicState extends State<Basic> {\n  @override\n  Widget build(BuildContext context) {\n    return Section(\n      title: S.of(context).basicTitle,\n      subTitle: S.of(context).basicDescription,\n      child: Container(\n        decoration: BoxDecoration(\n          color: CupertinoColors.white,\n          borderRadius: BorderRadius.circular(8),\n        ),\n        child: Column(\n          children: _buildActions(context, onlyBase: false),\n        ),\n      ),\n    );\n  }\n}\n\nclass BasicAllPage extends StatelessWidget {\n  const BasicAllPage({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      backgroundColor: CupertinoColors.secondarySystemBackground,\n      navigationBar: const CupertinoNavigationBar(\n        middle: Text('All Basics'),\n      ),\n      child: SafeArea(\n        child: Center(\n          child: ListView(\n            physics: const AlwaysScrollableScrollPhysics(),\n            children: [\n              Container(\n                margin: const EdgeInsets.all(16.0),\n                decoration: BoxDecoration(\n                  color: CupertinoColors.white,\n                  borderRadius: BorderRadius.circular(8),\n                ),\n                child: Column(\n                  children: _buildActions(context, onlyBase: false),\n                ),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n\nList<Widget> _buildActions(BuildContext context, {bool onlyBase = true}) {\n  final base = [\n    _Action(\n      title: S.of(context).basicFlutter2Native,\n      subTitle: 'ios: viewController android: activity',\n      begin: _Action.flutter,\n      end: _Action.native,\n      onTap: () => Navigator.of(context).push(\n        CupertinoPageRoute(builder: (_) => const Flutter2NativePage()),\n      ),\n    ),\n    const Divider(height: 1),\n    _Action(\n      title: S.of(context).basicNative2Flutter,\n      subTitle: 'viewController activity fragment',\n      begin: _Action.native,\n      end: _Action.flutter,\n      onTap: () => Navigator.of(context).nativePushNamed('native2flutter'),\n    ),\n    const Divider(height: 1),\n    _Action(\n      title: S.of(context).basicFlutter2Flutter,\n      subTitle: S.of(context).basicFlutter2FlutterDescription,\n      begin: _Action.flutter,\n      end: _Action.flutter,\n      onTap: () => Navigator.of(context).push(\n        CupertinoPageRoute(builder: (_) => const Flutter2Flutter()),\n      ),\n    ),\n  ];\n  if (onlyBase) return base;\n  return [\n    ...base,\n    const Divider(height: 1),\n    _Action(\n      title: S.of(context).basicChild,\n      subTitle: S.of(context).basicChildDescription,\n      begin: _Action.flutter,\n      end: const Icon(Icons.widgets),\n      onTap: () => Navigator.of(context).nativePushNamed('tabContainer'),\n    ),\n  ];\n}\n\nclass _Action extends StatelessWidget {\n  final String title;\n  final String subTitle;\n  final Widget begin;\n  final Widget end;\n  final VoidCallback onTap;\n\n  const _Action({\n    Key? key,\n    required this.title,\n    required this.subTitle,\n    required this.begin,\n    required this.end,\n    required this.onTap,\n  }) : super(key: key);\n\n  static Widget get flutter => const FlutterLogo();\n  static Widget get native =>\n      const Icon(Icons.mobile_screen_share, color: CupertinoColors.activeBlue);\n\n  @override\n  Widget build(BuildContext context) {\n    return TextButton(\n      onPressed: onTap,\n      child: Padding(\n        padding: const EdgeInsets.all(12.0),\n        child: Row(\n          mainAxisAlignment: MainAxisAlignment.spaceAround,\n          children: [\n            Expanded(\n              child: Wrap(\n                direction: Axis.vertical,\n                children: [\n                  Row(\n                    children: [\n                      begin,\n                      const Icon(\n                        Icons.arrow_right_alt,\n                        color: CupertinoColors.tertiaryLabel,\n                      ),\n                      end\n                    ],\n                  ),\n                  const SizedBox(height: 10),\n                  Text(\n                    title,\n                    style: const TextStyle(\n                        fontWeight: FontWeight.w500,\n                        color: CupertinoColors.black),\n                  ),\n                  Text(\n                    subTitle,\n                    maxLines: 2,\n                    style: const TextStyle(\n                        fontSize: 12, color: CupertinoColors.secondaryLabel),\n                  )\n                ],\n              ),\n            ),\n            const Spacer(),\n            const Icon(\n              CupertinoIcons.right_chevron,\n              color: CupertinoColors.tertiaryLabel,\n            )\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/pages/flutter_to_flutter.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nclass Flutter2Flutter extends StatefulWidget {\n  final int? index;\n\n  const Flutter2Flutter({Key? key, this.index}) : super(key: key);\n\n  @override\n  _Flutter2FlutterState createState() => _Flutter2FlutterState();\n}\n\nclass _Flutter2FlutterState extends State<Flutter2Flutter> {\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      navigationBar: CupertinoNavigationBar(\n        middle: Text('Flutter to Flutter ${widget.index ?? 0}'),\n      ),\n      backgroundColor: widget.index == null ? Colors.red : null,\n      child: SafeArea(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              const Padding(\n                padding: EdgeInsets.all(8.0),\n                child: Text(\n                    'Flutter 页面之间的跳转和纯flutter项目没有任何区别， navigator的所有api均可使用'),\n              ),\n              TextButton(\n                child: const Text('Open New Flutter Page'),\n                onPressed: () {\n                  Navigator.of(context).push(\n                    CupertinoPageRoute(\n                      builder: (_) => Flutter2Flutter(\n                        index: (widget.index ?? 0) + 1,\n                      ),\n                    ),\n                  );\n\n                  // router.navigateTo(context, '/flutter2flutter');\n\n                  // Get.to(Flutter2Flutter(index: (widget.index ?? 0) + 1));\n                },\n              ),\n              TextButton(\n                child: const Text('Open New Flutter By New Container'),\n                onPressed: () => Navigator.of(context).nativePushNamed(\n                    'flutter2flutter',\n                    arguments: {'index': (widget.index ?? 1) * -1},\n                    options: Options()..flutterRoute()),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/pages/flutter_to_native.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nclass Flutter2NativePage extends StatefulWidget {\n  const Flutter2NativePage({Key? key}) : super(key: key);\n\n  @override\n  _Flutter2NativePageState createState() => _Flutter2NativePageState();\n}\n\nclass _Flutter2NativePageState extends State<Flutter2NativePage> {\n  Object? _result;\n\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      navigationBar: const CupertinoNavigationBar(\n        middle: Text('Flutter to Native'),\n      ),\n      child: SafeArea(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              const Padding(\n                padding: EdgeInsets.all(8.0),\n                child: Text('支持🍎和🍐两种方式打开'),\n              ),\n              TextButton(\n                  child:\n                      const Text('🍎: Navigator.of(context)?.nativePushNamed'),\n                  onPressed: () async {\n                    _showResult(\n                        context,\n                        await Navigator.of(context)\n                            .nativePushNamed('flutter2native', arguments: {}));\n                  }),\n              TextButton(\n                  child: const Text('🍐: Navigator.of(context)?.pushNamed'),\n                  onPressed: () async {\n                    _showResult(\n                        context,\n                        await Navigator.of(context).pushNamed<Object?>(\n                            'flutter2native',\n                            arguments: {}));\n                  }),\n              if (_result != null)\n                Text(\n                  'result: $_result',\n                  style: const TextStyle(color: CupertinoColors.destructiveRed),\n                ),\n              const Padding(\n                padding: EdgeInsets.all(8.0),\n                child: Text('''推荐使用🍎来打开native路由\n\n注意事项\n\n如果在flutter侧配置了RouteFactory onUnknownRoute或者flutter有重名路由那么在flutter侧查找路会返回true,这种case只能用🍎来打开native页面\n                '''),\n              )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  void _showResult(BuildContext context, Object? result) {\n    if (mounted) {\n      setState(() {\n        _result = result ?? 'NO RESULT';\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/pages/native_to_flutter.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nclass Native2FlutterPage extends StatefulWidget {\n  final dynamic date;\n\n  const Native2FlutterPage(this.date, {Key? key}) : super(key: key);\n\n  @override\n  _Native2FlutterPageState createState() => _Native2FlutterPageState();\n}\n\nclass _Native2FlutterPageState extends State<Native2FlutterPage> {\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      navigationBar: const CupertinoNavigationBar(\n        middle: Text('Native2Flutter'),\n      ),\n      child: SafeArea(\n        child: Center(\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Text(widget.date ?? 'No Date'),\n              TextButton(\n                child: const Text('带参数返回'),\n                onPressed: () =>\n                    Navigator.of(context).pop('Result From Flutter'),\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n\n  @override\n  void deactivate() {\n    super.deactivate();\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/pages/tab_page.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass TabPage extends StatefulWidget {\n  const TabPage({Key? key}) : super(key: key);\n\n  @override\n  _TabPageState createState() => _TabPageState();\n}\n\nclass _TabPageState extends State<TabPage> {\n  @override\n  Widget build(BuildContext context) {\n    return const Center(\n      child: Column(\n        mainAxisAlignment: MainAxisAlignment.center,\n        children: [\n          FlutterLogo(\n            style: FlutterLogoStyle.stacked,\n          ),\n          SizedBox(height: 20),\n          Text('Hello guy, This is Flutter Tab'),\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/basic/pages/transparent_page.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nclass TransparentPage extends StatefulWidget {\n  const TransparentPage({Key? key}) : super(key: key);\n\n  @override\n  _TransparentPageState createState() => _TransparentPageState();\n}\n\nclass _TransparentPageState extends State<TransparentPage>\n    with SingleTickerProviderStateMixin {\n  var _opacity = 0.0;\n\n  @override\n  void initState() {\n    super.initState();\n\n    Future.microtask(\n      () => setState(() {\n        _opacity = 0.5;\n      }),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return PopScope(\n      canPop: false,\n      onPopInvoked: (didPop) async {\n        if (didPop) return;\n        await showCupertinoDialog(\n            context: context,\n            builder: (context) => CupertinoAlertDialog(\n                  title: const Text('这里可以拦截返回'),\n                  actions: [\n                    CupertinoActionSheetAction(\n                      onPressed: () {\n                        Future.microtask(() {\n                          setState(() {\n                            _opacity = 0.0;\n                          });\n                          Navigator.of(context).pop(true);\n                        });\n                      },\n                      child: const Text('返回'),\n                    )\n                  ],\n                ));\n        Future.delayed(const Duration(milliseconds: 300), () {\n          Navigator.of(context).pop();\n        });\n      },\n      child: AnimatedOpacity(\n        opacity: _opacity,\n        duration: const Duration(milliseconds: 200),\n        child: GestureDetector(\n          child: Container(\n            color: Colors.black,\n          ),\n          onTap: () => Navigator.of(context).maybePop(),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/notification/notification.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nimport '../../../utils/simple_localizations.dart';\nimport '../../../widgets/action.dart';\nimport '../../../widgets/section.dart';\n\nclass GlobalNotification extends StatefulWidget {\n  const GlobalNotification({Key? key}) : super(key: key);\n\n  @override\n  _GlobalNotificationState createState() => _GlobalNotificationState();\n}\n\nclass _GlobalNotificationState extends State<GlobalNotification> {\n  String? _localMessage;\n\n  @override\n  Widget build(BuildContext context) {\n    return FaradayNotificationListener(\n      const ['NotificationFromNative'],\n      onNotification: (_, value) {\n        setState(() {\n          _localMessage = value.arguments.toString();\n        });\n      },\n      child: Padding(\n        padding: const EdgeInsets.only(right: 16),\n        child: Section(\n          title: S.of(context).notification,\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: [\n              FaradayAction(\n                icon: Icon(\n                  _localMessage == null\n                      ? Icons.notifications\n                      : Icons.notifications_active,\n                  color: Colors.white,\n                ),\n                color: Colors.deepPurpleAccent,\n                onTap: () {\n                  setState(() {\n                    _localMessage = null;\n                    FaradayNotification('GlobalNotification')\n                        .dispatchToGlobal();\n                  });\n                },\n                description: 'Post Notification To Native',\n              ),\n              if (_localMessage != null)\n                TweenAnimationBuilder(\n                  duration: const Duration(milliseconds: 300),\n                  tween: Tween(begin: 5.0, end: 1.0),\n                  builder: (context, dynamic value, child) =>\n                      Transform.scale(scale: value, child: child),\n                  child: Padding(\n                    padding: const EdgeInsets.all(8.0),\n                    child: Text(\n                      _localMessage!,\n                      style: TextStyle(color: Colors.purple[900]),\n                      overflow: TextOverflow.fade,\n                    ),\n                  ),\n                )\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/other/other.dart",
    "content": "import 'dart:io';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nimport '../../../utils/simple_localizations.dart';\nimport '../../../widgets/action.dart';\nimport '../../../widgets/section.dart';\nimport '../../example_page_scaffold.dart';\n\nclass Others extends StatefulWidget {\n  const Others({Key? key}) : super(key: key);\n\n  @override\n  _OthersState createState() => _OthersState();\n}\n\nclass _OthersState extends State<Others> {\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.only(right: 16),\n      child: Section(\n        title: S.of(context).otherTitle,\n        subTitle: S.of(context).otherDescription,\n        child: Row(\n          children: [\n            Expanded(\n              child: FaradayAction(\n                color: Colors.teal,\n                icon: const Icon(Icons.wrap_text, color: Colors.white),\n                description: '拦截返回',\n                onTap: () => Navigator.of(context)\n                    .push(CupertinoPageRoute(builder: (_) => _WillPopPage())),\n              ),\n            ),\n            const SizedBox(width: 8.0),\n            Expanded(\n              child: FaradayAction(\n                color: Colors.blueAccent,\n                icon: const Icon(Icons.view_stream, color: Colors.white),\n                description: Platform.isIOS ? 'iOS 自动处理导航条' : 'No Action',\n                onTap: () {\n                  if (Platform.isIOS) {\n                    Navigator.of(context).nativePushNamed('navigationBar');\n                  }\n                },\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\nclass _WillPopPage extends StatefulWidget {\n  @override\n  __WillPopPageState createState() => __WillPopPageState();\n}\n\nclass __WillPopPageState extends State<_WillPopPage> {\n  @override\n  Widget build(BuildContext context) {\n    return CupertinoPageScaffold(\n      child: PopScope(\n          canPop: false,\n          onPopInvoked: (didPop) async {\n            if (didPop) return;\n\n            final r = await showCupertinoDialog(\n                builder: (context) => CupertinoAlertDialog(\n                      content: const Text('确定退出吗?'),\n                      actions: [\n                        CupertinoDialogAction(\n                          isDefaultAction: true,\n                          onPressed: () => Navigator.of(context).pop(false),\n                          child: const Text('按错了'),\n                        ),\n                        CupertinoDialogAction(\n                          isDestructiveAction: true,\n                          onPressed: () => Navigator.of(context).pop(true),\n                          child: const Text('退出'),\n                        )\n                      ],\n                    ),\n                context: context);\n            if (r) {\n              // ignore: use_build_context_synchronously\n              Navigator.of(context).pop();\n            }\n          },\n          child: ExamplePageScaffold(\n            'WillPopScope',\n            children: [\n              const Text('当前页面拦截了返回，所以iOS不能滑动返回，android点返回键需要确认'),\n              TextButton(\n                  child: const Text('需要确认: Navigator.of(context)?.maybePop()'),\n                  onPressed: () => Navigator.of(context).maybePop()),\n              TextButton(\n                  child: const Text('直接返回: Navigator.of(context)?.pop()'),\n                  onPressed: () => Navigator.of(context).pop()),\n            ],\n          )),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/features/splash/splash.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\nimport '../../../utils/simple_localizations.dart';\nimport '../../../widgets/section.dart';\nimport '../../example_page_scaffold.dart';\n\nclass Splash extends StatefulWidget {\n  const Splash({Key? key}) : super(key: key);\n\n  @override\n  _SplashState createState() => _SplashState();\n}\n\nenum _Platform { ios, android, fluter }\n\nclass _SplashState extends State<Splash> {\n  @override\n  Widget build(BuildContext context) {\n    return Section(\n      title: S.of(context).splashTitle,\n      subTitle: S.of(context).splashDescription,\n      child: Row(\n        mainAxisAlignment: MainAxisAlignment.spaceAround,\n        children: [\n          ..._Platform.values.map((p) {\n            final text = p == _Platform.ios\n                ? 'iOS'\n                : _Platform.android == p\n                    ? 'Android'\n                    : 'Flutter';\n\n            return CupertinoButton(\n              child: Text(text,\n                  style: TextStyle(\n                    color: _Platform.ios == p\n                        ? Colors.black\n                        : _Platform.android == p\n                            ? Colors.green[800]\n                            : Colors.blue,\n                  )),\n              onPressed: () => Navigator.of(context).push(CupertinoPageRoute(\n                  builder: (_) => SplashTipPage(p, title: text),\n                  fullscreenDialog: true)),\n            );\n          })\n        ],\n      ),\n    );\n  }\n}\n\nclass SplashTipPage extends StatefulWidget {\n  final String? title;\n  final _Platform platform;\n\n  const SplashTipPage(this.platform, {Key? key, this.title}) : super(key: key);\n\n  @override\n  _SplashTipPageState createState() => _SplashTipPageState();\n}\n\nclass _SplashTipPageState extends State<SplashTipPage> {\n  @override\n  Widget build(BuildContext context) {\n    return ExamplePageScaffold(\n      widget.title,\n      children: _Platform.ios == widget.platform\n          ? _buildIOSTip(context)\n          : _Platform.android == widget.platform\n              ? _buildAndroidTip(context)\n              : _buildFlutterTip(context),\n    );\n  }\n\n  // 这个大写 IOS 很难受\n  List<Widget> _buildIOSTip(BuildContext context) {\n    return [\n      const Padding(\n        padding: EdgeInsets.all(8.0),\n        child: Text('iOS过渡页只需要设置ViewController的`splashScreenView`即可'),\n      ),\n      TextButton(\n          child: const Text('查看`HomeFlutterViewController.swift`'),\n          onPressed: () {})\n    ];\n  }\n\n  List<Widget> _buildAndroidTip(BuildContext context) {\n    return [\n      const Text('一共有3种方式，根据需求自己选择'),\n      const Text('1. 设置 Intent Builder的backgroundColor'),\n      TextButton(child: const Text('查看 CustomRoute.kt'), onPressed: () {}),\n      const Text('2. manifest 中配置对应Activity的 meta data'),\n      TextButton(child: const Text('查看 AndroidManifest'), onPressed: () {}),\n      const Text('3. 继承FaradayActivity然后实现 provideSplashScreen'),\n      TextButton(child: const Text('查看 FaradayActivity.kt'), onPressed: () {}),\n    ];\n  }\n\n  List<Widget> _buildFlutterTip(BuildContext context) {\n    return [\n      const Padding(\n        padding: EdgeInsets.all(8.0),\n        child: Text('Flutter的过渡页逻辑最为简单'),\n      ),\n      const Text('在页面内容尚未渲染完成时，用户会看到容器背景，只需要根据特定逻辑返回一个颜色值即可'),\n      TextButton(\n          child: const Text('查看`main.dart`->`faraday.wrapper'),\n          onPressed: () {})\n    ];\n  }\n}\n"
  },
  {
    "path": "example/lib/src/pages/home_page.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport '../utils/simple_localizations.dart';\nimport '../widgets/section.dart';\nimport 'features/basic/basic.dart';\nimport 'features/notification/notification.dart';\nimport 'features/other/other.dart';\nimport 'features/splash/splash.dart';\n\nclass HomePage extends StatefulWidget {\n  final dynamic args;\n\n  const HomePage(this.args, {Key? key}) : super(key: key);\n\n  @override\n  _HomePageState createState() => _HomePageState();\n}\n\nclass _HomePageState extends State<HomePage> {\n  @override\n  void initState() {\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return AnnotatedRegion<SystemUiOverlayStyle>(\n      value: SystemUiOverlayStyle.light,\n      child: PopScope(\n        canPop: false,\n        onPopInvoked: (didPop) async {\n          if (didPop) return;\n          final r = await showCupertinoDialog(\n              builder: (context) => CupertinoAlertDialog(\n                    content: const Text('确定退出吗?'),\n                    actions: [\n                      CupertinoDialogAction(\n                        isDefaultAction: true,\n                        onPressed: () => Navigator.of(context).pop(false),\n                        child: const Text('按错了'),\n                      ),\n                      CupertinoDialogAction(\n                        isDestructiveAction: true,\n                        onPressed: () => Navigator.of(context).pop(true),\n                        child: const Text('退出'),\n                      )\n                    ],\n                  ),\n              context: context);\n          if (r) {\n            // ignore: use_build_context_synchronously\n            Navigator.of(context).pop();\n          }\n        },\n        child: CupertinoPageScaffold(\n          backgroundColor: CupertinoColors.secondarySystemBackground,\n          child: CustomScrollView(\n            physics: const AlwaysScrollableScrollPhysics(),\n            slivers: _buildSlivers(context),\n          ),\n        ),\n      ),\n    );\n  }\n\n  List<Widget> _buildSlivers(BuildContext context) {\n    return [\n      CupertinoSliverNavigationBar(\n        backgroundColor: CupertinoColors.white,\n        border: null,\n        largeTitle: Text(S.of(context).homeTitle),\n      ),\n      SliverPersistentHeader(\n        delegate: HomePageBannerDelegate(),\n        floating: false,\n        pinned: false,\n      ),\n      const SliverToBoxAdapter(child: Basic()),\n      const SliverToBoxAdapter(child: Splash()),\n      const SliverToBoxAdapter(child: GlobalNotification()),\n      const SliverToBoxAdapter(child: Others()),\n      SliverToBoxAdapter(\n        child: Section(\n          title: S.of(context).advanceTitle,\n          subTitle: S.of(context).advanceDescription,\n          //\n          // 有什么你想要的功能没有看到，可以在 github 提 issue 我们会尽快加上哦\n          //\n          child: Row(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: [\n              Transform.scale(\n                scale: 0.6,\n                child: Image.asset('images/faraday.png'),\n              ),\n              const Padding(\n                padding: EdgeInsets.all(8.0),\n                child: Text(\n                  'Faraday',\n                  style: TextStyle(color: CupertinoColors.secondaryLabel),\n                ),\n              )\n            ],\n          ),\n        ),\n      ),\n    ];\n  }\n}\n\nclass HomePageBannerDelegate extends SliverPersistentHeaderDelegate {\n  @override\n  Widget build(\n      BuildContext context, double shrinkOffset, bool overlapsContent) {\n    return AnimatedContainer(\n      padding: const EdgeInsets.all(16),\n      duration: const Duration(microseconds: 100),\n      color: Colors.white,\n      child: Column(\n        crossAxisAlignment: CrossAxisAlignment.start,\n        children: [\n          Text('* ${S.of(context).homeTip1}'),\n          Padding(\n            padding: const EdgeInsets.symmetric(vertical: 8),\n            child: Text('* ${S.of(context).homeTip2}'),\n          ),\n          Text('* ${S.of(context).homeTip3}',\n              style: DefaultTextStyle.of(context)\n                  .style\n                  .apply(color: const Color(0xF0900000))),\n        ],\n      ),\n    );\n  }\n\n  @override\n  double get maxExtent => 150;\n\n  @override\n  double get minExtent => 150;\n\n  @override\n  bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {\n    return false;\n  }\n}\n"
  },
  {
    "path": "example/lib/src/utils/observer.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass DemoObserver extends NavigatorObserver {\n  // 请使用 route.navigator 这个navigator永远为null\n  @override\n  NavigatorState? get navigator => null;\n\n  @override\n  void didPop(Route route, Route? previousRoute) {\n    debugPrint(\n        // ignore: lines_longer_than_80_chars\n        'observer: didPop ${route.settings.name} navigator: ${route.navigator}');\n    super.didPop(route, previousRoute);\n  }\n\n  @override\n  void didPush(Route route, Route? previousRoute) {\n    debugPrint(\n        // ignore: lines_longer_than_80_chars\n        'observer: didPush ${route.settings.name} navigator: ${route.navigator}');\n    super.didPush(route, previousRoute);\n  }\n}\n"
  },
  {
    "path": "example/lib/src/utils/simple_localizations.dart",
    "content": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\n// SimpleLocalizations\nclass S {\n  S(this.locale);\n\n  final Locale locale;\n\n  static SimpleLocalizationsDelegate delegate =\n      const SimpleLocalizationsDelegate();\n\n  static S of(BuildContext context) {\n    return Localizations.of<S>(context, S)!;\n  }\n\n  static final JSON _localizedValues = JSON({\n    'en': {\n      'home': {\n        'title': 'Faraday Features Demo',\n        'tip1': 'All flutter page has faraday banner on rightTop',\n        'tip2': 'All feature available on ios&android',\n        'tip3': 'Debug Mode will show an error page. it is expected.'\n      },\n      'basic': {\n        'title': 'Basic(基础)',\n        'description': 'Supported basic route features',\n        'f2n': 'flutter page open to native page',\n        'n2f': 'native page push flutter route',\n        'f2f': 'flutter open new flutter route',\n        'f2f_d': 'Supported open flutter route in new container',\n        'fc': 'show flutter page in `ChildContainer`',\n        'fc_d': 'flutter page in tab'\n      },\n      'splash': {\n        'title': 'Splash Screen (闪屏过渡页)',\n        'description': 'Resolve ALL, Splash Issues',\n      },\n      'notification': 'Global Notification(通知)',\n      'other': {\n        'title': 'Others(其他)',\n        'description': 'Some helpers',\n      },\n      'advance': {\n        'title': 'Advance(高级功能)',\n        'description': 'Browse source code, finding advance features🚀',\n      }\n    },\n    'zh': {\n      'home': {\n        'title': 'Faraday功能演示',\n        'tip1': '右上角有绿色角标的均为 Flutter 页面',\n        'tip2': '所有功能在 iOS/Android 均可用',\n        'tip3': 'Debug模式第一次打开Flutter页面时出现一闪而过的红屏是正常的'\n      },\n      'basic': {\n        'title': '基础(Basic)',\n        'description': '集成faraday的基础功能',\n        'f2n': '从Flutter跳转到Native页面',\n        'n2f': '从Flutter跳转到Flutter页面',\n        'f2f': '从Flutter跳转到Flutter页面',\n        'f2f_d': '支持在新的native容器打开',\n        'fc': '将Flutter作为子页面引入`',\n        'fc_d': '在native容器中作为tab添加flutter页面'\n      },\n      'splash': {\n        'title': '闪屏过渡页(Splash Screen)',\n        'description': '解决各种闪屏、黑屏、白屏等疑难杂症',\n      },\n      'notification': '通知(Global Notification)',\n      'other': {\n        'title': '其他(Others)',\n        'description': '其他一些有趣的小功能',\n      },\n      'advance': {\n        'title': '高级功能(Advance)',\n        'description': '以下是隐藏内容,请查看源码',\n      }\n    },\n  });\n\n  String get otherTitle => _values['other']['title'].stringValue;\n  String get otherDescription => _values['other']['description'].stringValue;\n\n  String get splashTitle => _values['splash']['title'].stringValue;\n  String get splashDescription => _values['splash']['description'].stringValue;\n\n  String get notification => _values['notification'].stringValue;\n\n  String get advanceTitle => _values['advance']['title'].stringValue;\n  String get advanceDescription =>\n      _values['advance']['description'].stringValue;\n\n  JSON get _values => _localizedValues[locale.languageCode];\n\n  String get homeTitle => _values[['home', 'title']].stringValue;\n  String get homeTip1 => _values[['home', 'tip1']].stringValue;\n  String get homeTip2 => _values[['home', 'tip2']].stringValue;\n  String get homeTip3 => _values[['home', 'tip3']].stringValue;\n\n  String get basicTitle => _values[['basic', 'title']].stringValue;\n  String get basicDescription => _values[['basic', 'description']].stringValue;\n  String get basicFlutter2Native => _values[['basic', 'f2n']].stringValue;\n  String get basicNative2Flutter => _values[['basic', 'n2f']].stringValue;\n  String get basicFlutter2Flutter => _values[['basic', 'f2f']].stringValue;\n  String get basicFlutter2FlutterDescription =>\n      _values[['basic', 'f2f_d']].stringValue;\n  String get basicChild => _values[['basic', 'fc']].stringValue;\n  String get basicChildDescription => _values[['basic', 'fc_d']].stringValue;\n}\n\nclass SimpleLocalizationsDelegate extends LocalizationsDelegate<S> {\n  const SimpleLocalizationsDelegate();\n\n  @override\n  bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode);\n\n  @override\n  Future<S> load(Locale locale) {\n    return SynchronousFuture<S>(S(locale));\n  }\n\n  @override\n  bool shouldReload(SimpleLocalizationsDelegate old) => false;\n}\n"
  },
  {
    "path": "example/lib/src/widgets/action.dart",
    "content": "import 'package:flutter/material.dart';\n\nclass FaradayAction extends StatelessWidget {\n  final Color? color;\n  final Widget icon;\n  final VoidCallback? onTap;\n  final String description;\n\n  const FaradayAction(\n      {Key? key,\n      this.color,\n      required this.icon,\n      this.onTap,\n      required this.description})\n      : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      height: 100,\n      decoration: BoxDecoration(\n        color: color,\n        borderRadius: BorderRadius.circular(12),\n      ),\n      child: TextButton(\n        onPressed: onTap,\n        child: Stack(\n          children: [\n            Positioned(\n              top: 8.0,\n              left: 8.0,\n              child: icon,\n            ),\n            Positioned(\n              left: 8.0,\n              bottom: 8.0,\n              child: Text(\n                description,\n                style: const TextStyle(\n                    color: Colors.white,\n                    fontWeight: FontWeight.bold,\n                    fontSize: 16),\n              ),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/lib/src/widgets/section.dart",
    "content": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\n\n// ignore: public_member_api_docs\nclass Section extends StatelessWidget {\n  final String title;\n  final String? subTitle;\n  final Widget child;\n  final VoidCallback? onTapViewAll;\n\n  const Section({\n    Key? key,\n    required this.title,\n    this.subTitle,\n    this.onTapViewAll,\n    required this.child,\n  }) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return Padding(\n      padding: const EdgeInsets.symmetric(horizontal: 16.0),\n      child: Column(\n        mainAxisSize: MainAxisSize.min,\n        children: [\n          Padding(\n            padding: const EdgeInsets.symmetric(vertical: 8),\n            child: Row(\n              mainAxisSize: MainAxisSize.max,\n              mainAxisAlignment: MainAxisAlignment.start,\n              children: [\n                Column(\n                  crossAxisAlignment: CrossAxisAlignment.start,\n                  children: [\n                    Text(title,\n                        style: const TextStyle(\n                            fontSize: 20, fontWeight: FontWeight.bold)),\n                    if (subTitle != null)\n                      Text(\n                        subTitle!,\n                        style: const TextStyle(\n                            fontSize: 14,\n                            color: CupertinoColors.secondaryLabel),\n                      )\n                  ],\n                ),\n                const Spacer(),\n                if (onTapViewAll != null)\n                  CupertinoButton(\n                    onPressed: onTapViewAll,\n                    padding: const EdgeInsets.symmetric(vertical: 16.0),\n                    child: const Text('查看全部', style: TextStyle(fontSize: 14)),\n                  ),\n              ],\n            ),\n          ),\n          child,\n          const Padding(\n            padding: EdgeInsets.only(top: 8.0),\n            child: Divider(),\n          )\n        ],\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example/pubspec.yaml",
    "content": "name: g_faraday_example\ndescription: Demonstrates how to use the g_faraday plugin.\nversion: 1.0.0+23\n\n# The following line prevents the package from being accidentally published to\n# pub.dev using `pub publish`. This is preferred for private packages.\npublish_to: \"none\" # Remove this line if you wish to publish to pub.dev\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n\n  g_faraday:\n    # When depending on this package from a real application you should use:\n    #   g_faraday: ^x.y.z\n    # See https://dart.dev/tools/pub/dependencies#version-constraints\n    # The example app is bundled with the plugin so we use a path dependency on\n    # the parent directory to use the current plugin's version.\n    path: ../\n  # fluro: ^1.7.8\n  # get: ^3.24.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: ^1.0.5\n\n  # flutter_localizations:\n  #   sdk: flutter\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^3.0.1\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/tools/pub/pubspec\n\n# The following section is specific to Flutter.\nflutter:\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  # To add assets to your application, add an assets section, like this:\n  assets:\n    - images/\n    - images/2.0x/\n    - images/3.0x/\n\n  # An image asset can refer to one or more resolution-specific \"variants\", see\n  # https://flutter.dev/assets-and-images/#resolution-aware.\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/assets-and-images/#from-packages\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.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "example/test/widget_test.dart",
    "content": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester\n// utility that Flutter provides. For example, you can send tap and scroll\n// gestures. You can also use WidgetTester to find child widgets in the widget\n// tree, read text, and verify that the values of widget properties are correct.\n\n// import 'package:flutter/material.dart';\n// import 'package:flutter_test/flutter_test.dart';\n// import 'package:g_faraday_example/main.dart';\n\n// void main() {\n//   testWidgets('Verify Platform version', (tester) async {\n//     // Build our app and trigger a frame.\n//     await tester.pumpWidget(MyApp());\n\n//     // Verify that platform version is retrieved.\n//     expect(\n//       find.byWidgetPredicate(\n//         (widget) => widget is Text && widget.data!.startsWith('Running on:'),\n//       ),\n//       findsOneWidget,\n//     );\n//   });\n// }\n"
  },
  {
    "path": "example_objc_only/.gitignore",
    "content": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.iws\n.idea/\n\n# The .vscode folder contains launch configuration and tasks you configure in\n# VS Code which you may wish to be included in version control, so this line\n# is commented out by default.\n#.vscode/\n\n# Flutter/Dart/Pub related\n**/doc/api/\n**/ios/Flutter/.last_build_id\n.dart_tool/\n.flutter-plugins\n.flutter-plugins-dependencies\n.packages\n.pub-cache/\n.pub/\n/build/\n\n# Web related\nlib/generated_plugin_registrant.dart\n\n# Symbolication related\napp.*.symbols\n\n# Obfuscation related\napp.*.map.json\n\n# Android Studio will place build artifacts here\n/android/app/debug\n/android/app/profile\n/android/app/release\n"
  },
  {
    "path": "example_objc_only/.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: 022b333a089afb81c471ec43d1f1f4f26305d876\n  channel: unknown\n\nproject_type: app\n"
  },
  {
    "path": "example_objc_only/README.md",
    "content": "# g_faraday Objective 集成\n\n## 创建 `FaradayHelper.swift`\n\n``` swift\n@objc class FaradayHelper: NSObject {\n    \n    @objc static func enableAutomaticallyExtension() {\n        // 自动处理导航栏\n        UINavigationController.fa.automaticallyHandleNavigationBarHidden()\n        // 自动回调空值到flutter侧，避免flutter侧 await 一直不返回\n        UIViewController.fa.automaticallyCallbackNullToFlutter()\n    }\n    \n    @objc static func startFlutterEngine(navigatorDelegate: FaradayNavigationDelegate,\n                                         httpProvider: FaradayHttpProvider? = nil,\n                                         commonHandler: FaradayHandler? = nil) {\n        Faraday.default.startFlutterEngine(navigatorDelegate: navigatorDelegate, httpProvider: httpProvider, commonHandler: commonHandler)\n    }\n    \n    @objc static var currentFlutterViewController: FaradayFlutterViewController? {\n        return Faraday.default.currentFlutterViewController\n    }\n    \n    @objc static func postNotification(_ name: String, arguments: Any? = nil) {\n        Faraday.default.postNotification(name, arguments: arguments)\n    }\n    \n    @objc static func enableCallback(_ viewController: FaradayFlutterViewController, callback token: CallbackToken) {\n        viewController.fa.enableCallback(with: token)\n    }\n}\n```\n\n## 实现对应接口\n\n``` objc\n\n@import g_faraday;\n\n@interface AppDelegate (Faraday) <FFNavigationDelegate, FFHttpProvider>\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application\n    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n        \n    [FaradayHelper enableAutomaticallyExtension];\n    \n    [FaradayHelper startFlutterEngineWithNavigatorDelegate:self httpProvider:self commonHandler:^(NSString * _Nonnull name, id _Nullable arguments, void (^ _Nonnull completion)(id _Nullable result)) {\n        \n    }];\n\n    return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n\n@end\n\n\n@implementation AppDelegate(Faraday)\n\n// mark -\n- (void)push:(NSString * _Nonnull)name arguments:(id _Nullable)arguments options:(Options * _Nonnull)options callback:(NSUUID * _Nonnull)token {\n    \n    FFViewController *fvc = [[FFViewController alloc] init:@\"home\" arguments:nil backgroundClear:NO engine:nil callback:^(id _Nullable result) {\n        \n    }];\n    \n    UIViewController *root = [UIApplication.sharedApplication keyWindow].rootViewController;\n    \n    [root presentViewController:fvc animated:true completion:^{\n            \n    }];\n    \n    // 重要 不然咩有回调\n    [FaradayHelper enableCallback:fvc callback:token];\n}\n\n// mark -\n- (void)requestWithMethod:(NSString * _Nonnull)method url:(NSString * _Nonnull)url parameters:(NSDictionary<NSString *,id> * _Nullable)parameters headers:(NSDictionary<NSString *,NSString *> * _Nullable)headers completion:(void (^ _Nonnull)(id _Nullable))completion {\n}\n\n@end\n\n```\n"
  },
  {
    "path": "example_objc_only/ios/.gitignore",
    "content": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedData/\nIcon?\n**/Pods/\n**/.symlinks/\nprofile\nxcuserdata\n**/.generated/\nFlutter/App.framework\nFlutter/Flutter.framework\nFlutter/Flutter.podspec\nFlutter/Generated.xcconfig\nFlutter/app.flx\nFlutter/app.zip\nFlutter/flutter_assets/\nFlutter/flutter_export_environment.sh\nServiceDefinitions.json\nRunner/GeneratedPluginRegistrant.*\n\n# Exceptions to above rules.\n!default.mode1v3\n!default.mode2v3\n!default.pbxuser\n!default.perspectivev3\n"
  },
  {
    "path": "example_objc_only/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>$(DEVELOPMENT_LANGUAGE)</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>MinimumOSVersion</key>\n  <string>8.0</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "example_objc_only/ios/Flutter/Debug.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example_objc_only/ios/Flutter/Release.xcconfig",
    "content": "#include \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "example_objc_only/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\nproject 'Runner', {\n  'Debug' => :debug,\n  'Profile' => :release,\n  'Release' => :release,\n}\n\ndef flutter_root\n  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)\n  unless File.exist?(generated_xcode_build_settings_path)\n    raise \"#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first\"\n  end\n\n  File.foreach(generated_xcode_build_settings_path) do |line|\n    matches = line.match(/FLUTTER_ROOT\\=(.*)/)\n    return matches[1].strip if matches\n  end\n  raise \"FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get\"\nend\n\nrequire File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)\n\nflutter_ios_podfile_setup\n\ntarget 'Runner' do\n  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))\nend\n\npost_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n  end\nend\n"
  },
  {
    "path": "example_objc_only/ios/Runner/AppDelegate.h",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : FlutterAppDelegate\n\n@end\n"
  },
  {
    "path": "example_objc_only/ios/Runner/AppDelegate.m",
    "content": "#import \"AppDelegate.h\"\n#import \"Runner-Swift.h\"\n\n@import g_faraday;\n\n@interface AppDelegate (Faraday) <FFNavigationDelegate, FFHttpProvider>\n\n@end\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application\n    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n        \n    [FaradayHelper enableAutomaticallyExtension];\n    \n    [FaradayHelper startFlutterEngineWithNavigatorDelegate:self httpProvider:self commonHandler:^(NSString * _Nonnull name, id _Nullable arguments, void (^ _Nonnull completion)(id _Nullable result)) {\n        \n    }];\n\n    return [super application:application didFinishLaunchingWithOptions:launchOptions];\n}\n\n@end\n\n\n@implementation AppDelegate(Faraday)\n\n// mark -\n- (void)push:(NSString * _Nonnull)name arguments:(id _Nullable)arguments options:(Options * _Nonnull)options callback:(NSUUID * _Nonnull)token {\n    \n    FFViewController *fvc = [[FFViewController alloc] init:@\"home\" arguments:nil backgroundClear:NO engine:nil callback:^(id _Nullable result) {\n        \n    }];\n    \n    UIViewController *root = [UIApplication.sharedApplication keyWindow].rootViewController;\n    \n    [root presentViewController:fvc animated:true completion:^{\n            \n    }];\n    \n    // 重要 不然咩有回调\n    [FaradayHelper enableCallback:fvc callback:token];\n}\n\n// mark -\n- (void)requestWithMethod:(NSString * _Nonnull)method url:(NSString * _Nonnull)url parameters:(NSDictionary<NSString *,id> * _Nullable)parameters headers:(NSDictionary<NSString *,NSString *> * _Nullable)headers completion:(void (^ _Nonnull)(id _Nullable))completion {\n}\n\n@end\n"
  },
  {
    "path": "example_objc_only/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": "example_objc_only/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": "example_objc_only/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": "example_objc_only/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": "example_objc_only/ios/Runner/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17701\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17703\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Demo View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"DemoViewController\" 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=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pgr-0Y-DiK\">\n                                <rect key=\"frame\" x=\"165.5\" y=\"433\" width=\"83\" height=\"30\"/>\n                                <state key=\"normal\" title=\"ShowFlutter\"/>\n                                <connections>\n                                    <action selector=\"onTapShowFlutter:\" destination=\"BYZ-38-t0r\" eventType=\"touchUpInside\" id=\"KIh-eG-ABZ\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"pgr-0Y-DiK\" firstAttribute=\"centerX\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerX\" id=\"hPf-nV-AQP\"/>\n                            <constraint firstItem=\"pgr-0Y-DiK\" firstAttribute=\"centerY\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"centerY\" id=\"o9z-BW-jCi\"/>\n                        </constraints>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-3\" y=\"-20\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "example_objc_only/ios/Runner/DemoViewController.h",
    "content": "//\n//  DemoViewController.h\n//  Runner\n//\n//  Created by gix on 2021/2/26.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface DemoViewController : UIViewController\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "example_objc_only/ios/Runner/DemoViewController.m",
    "content": "//\n//  DemoViewController.m\n//  Runner\n//\n//  Created by gix on 2021/2/26.\n//\n\n#import \"DemoViewController.h\"\n\n@import g_faraday;\n\n@interface DemoViewController ()\n\n@end\n\n@implementation DemoViewController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n}\n\n- (IBAction)onTapShowFlutter:(UIButton *)sender {\n    \n    FFViewController *fvc = [[FFViewController alloc] init:@\"home\" arguments:nil backgroundClear:NO engine:nil callback:^(id _Nullable result) {\n        \n    }];\n    \n    [self presentViewController:fvc animated:true completion:nil];\n}\n\n/*\n#pragma mark - Navigation\n\n// In a storyboard-based application, you will often want to do a little preparation before navigation\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {\n    // Get the new view controller using [segue destinationViewController].\n    // Pass the selected object to the new view controller.\n}\n*/\n\n@end\n"
  },
  {
    "path": "example_objc_only/ios/Runner/FaradayHelper.swift",
    "content": "//\n//  Test.swift\n//  Runner\n//\n//  Created by gix on 2021/2/25.\n//\n\nimport Foundation\nimport g_faraday\n\n@objc class FaradayHelper: NSObject {\n    \n    @objc static func enableAutomaticallyExtension() {\n        // 自动处理导航栏\n        UINavigationController.fa.automaticallyHandleNavigationBarHidden()\n        // 自动回调空值到flutter侧，避免flutter侧 await 一直不返回\n        UIViewController.fa.automaticallyCallbackNullToFlutter()\n    }\n    \n    @objc static func startFlutterEngine(navigatorDelegate: FaradayNavigationDelegate,\n                                         httpProvider: FaradayHttpProvider? = nil,\n                                         commonHandler: FaradayHandler? = nil) {\n        Faraday.default.startFlutterEngine(navigatorDelegate: navigatorDelegate, httpProvider: httpProvider, commonHandler: commonHandler)\n    }\n    \n    @objc static var currentFlutterViewController: FaradayFlutterViewController? {\n        return Faraday.default.currentFlutterViewController\n    }\n    \n    @objc static func postNotification(_ name: String, arguments: Any? = nil) {\n        Faraday.default.postNotification(name, arguments: arguments)\n    }\n    \n    @objc static func enableCallback(_ viewController: FaradayFlutterViewController, callback token: CallbackToken) {\n        viewController.fa.enableCallback(with: token)\n    }\n}\n"
  },
  {
    "path": "example_objc_only/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>$(DEVELOPMENT_LANGUAGE)</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>g_faraday_obj_demo</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(FLUTTER_BUILD_NAME)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(FLUTTER_BUILD_NUMBER)</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>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": "example_objc_only/ios/Runner/Runner-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
  },
  {
    "path": "example_objc_only/ios/Runner/main.m",
    "content": "#import <Flutter/Flutter.h>\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char* argv[]) {\n  @autoreleasepool {\n    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n  }\n}\n"
  },
  {
    "path": "example_objc_only/ios/Runner.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t02B17FF18820B1161A2C81B4 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78A9D2FCF7444D474645EA63 /* libPods-Runner.a */; };\n\t\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };\n\t\t5BFA5ECD25E7B8CF002E5E18 /* FaradayHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BFA5ECC25E7B8CF002E5E18 /* FaradayHelper.swift */; };\n\t\t5BFA5ED925E89BE1002E5E18 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BFA5ED725E89BE1002E5E18 /* GeneratedPluginRegistrant.m */; };\n\t\t5BFA5EDF25E89C99002E5E18 /* DemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BFA5EDE25E89C99002E5E18 /* DemoViewController.m */; };\n\t\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };\n\t\t97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };\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/* 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);\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\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = \"<group>\"; };\n\t\t5BFA5ECB25E7B8CE002E5E18 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Runner-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t5BFA5ECC25E7B8CF002E5E18 /* FaradayHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaradayHelper.swift; sourceTree = \"<group>\"; };\n\t\t5BFA5ED725E89BE1002E5E18 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = \"<group>\"; };\n\t\t5BFA5ED825E89BE1002E5E18 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = \"<group>\"; };\n\t\t5BFA5EDD25E89C99002E5E18 /* DemoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DemoViewController.h; sourceTree = \"<group>\"; };\n\t\t5BFA5EDE25E89C99002E5E18 /* DemoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DemoViewController.m; sourceTree = \"<group>\"; };\n\t\t5C10DC4FC2672C3D20EA656B /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.release.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t78A9D2FCF7444D474645EA63 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-Runner.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = \"<group>\"; };\n\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; 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\t97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\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\tC34304C3A42CDBC0B222B628 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.debug.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD09EE1DFEFAA9CE5C3B94474 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Runner.profile.xcconfig\"; path = \"Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig\"; sourceTree = \"<group>\"; };\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\t02B17FF18820B1161A2C81B4 /* libPods-Runner.a 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\t93A55D6ABCE6D11414D94026 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC34304C3A42CDBC0B222B628 /* Pods-Runner.debug.xcconfig */,\n\t\t\t\t5C10DC4FC2672C3D20EA656B /* Pods-Runner.release.xcconfig */,\n\t\t\t\tD09EE1DFEFAA9CE5C3B94474 /* Pods-Runner.profile.xcconfig */,\n\t\t\t);\n\t\t\tpath = 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\t3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,\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\t93A55D6ABCE6D11414D94026 /* Pods */,\n\t\t\t\tC0FCFF6D7A7C53C930E14289 /* 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\t5BFA5ED825E89BE1002E5E18 /* GeneratedPluginRegistrant.h */,\n\t\t\t\t5BFA5ED725E89BE1002E5E18 /* GeneratedPluginRegistrant.m */,\n\t\t\t\t7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,\n\t\t\t\t7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,\n\t\t\t\t5BFA5ECC25E7B8CF002E5E18 /* FaradayHelper.swift */,\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\t5BFA5ECB25E7B8CE002E5E18 /* Runner-Bridging-Header.h */,\n\t\t\t\t5BFA5EDD25E89C99002E5E18 /* DemoViewController.h */,\n\t\t\t\t5BFA5EDE25E89C99002E5E18 /* DemoViewController.m */,\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\t97C146F21CF9000F007C117D /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC0FCFF6D7A7C53C930E14289 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t78A9D2FCF7444D474645EA63 /* libPods-Runner.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\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\t7A9D4AED6015C08AD96A1518 /* [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\t3D4D067EAA0F4E4F5FBBF593 /* [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 = 1240;\n\t\t\t\tORGANIZATIONNAME = \"\";\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 = 1240;\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 9.3\";\n\t\t\tdevelopmentRegion = en;\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\t3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,\n\t\t\t\t97C146FE1CF9000F007C117D /* Assets.xcassets 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\\\" embed_and_thin\";\n\t\t};\n\t\t3D4D067EAA0F4E4F5FBBF593 /* [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\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t7A9D4AED6015C08AD96A1518 /* [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\tinputFileListPaths = (\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\toutputFileListPaths = (\n\t\t\t);\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\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/* 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\t978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,\n\t\t\t\t5BFA5ECD25E7B8CF002E5E18 /* FaradayHelper.swift in Sources */,\n\t\t\t\t97C146F31CF9000F007C117D /* main.m in Sources */,\n\t\t\t\t5BFA5EDF25E89C99002E5E18 /* DemoViewController.m in Sources */,\n\t\t\t\t5BFA5ED925E89BE1002E5E18 /* 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\t249021D3217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t249021D4217E4FDB00AE95B9 /* Profile */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.example.gFaradayObjDemo;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Profile;\n\t\t};\n\t\t97C147031CF9000F007C117D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.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\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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\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 = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\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\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.example.gFaradayObjDemo;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\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\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = \"$(FLUTTER_BUILD_NUMBER)\";\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 = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\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.example.gFaradayObjDemo;\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_VERSION = 5.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\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\t249021D3217E4FDB00AE95B9 /* Profile */,\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\t249021D4217E4FDB00AE95B9 /* Profile */,\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": "example_objc_only/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": "example_objc_only/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example_objc_only/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "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>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example_objc_only/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1240\"\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      shouldUseLaunchSchemeArgsEnv = \"YES\">\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      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\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   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Profile\"\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": "example_objc_only/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": "example_objc_only/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example_objc_only/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "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>PreviewsEnabled</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "example_objc_only/lib/main.dart",
    "content": "import 'package:flutter/material.dart';\nimport 'package:g_faraday/g_faraday.dart';\n\nvoid main() {\n  runApp(const DemoApp());\n}\n\nclass DemoApp extends StatefulWidget {\n  const DemoApp({super.key});\n\n  @override\n  DemoAppState createState() => DemoAppState();\n}\n\nclass DemoAppState extends State<DemoApp> {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      onGenerateRoute: (settings) => faraday.wrapper(\n        (settings) => MaterialPageRoute(\n          builder: (context) => Scaffold(\n            body: Center(\n              child: TextButton(\n                child: const Text('pop'),\n                onPressed: () => Navigator.of(context).pop(),\n              ),\n            ),\n          ),\n        ),\n      ),\n    );\n  }\n}\n"
  },
  {
    "path": "example_objc_only/pubspec.yaml",
    "content": "name: g_faraday_obj_demo\ndescription: A new Flutter project.\n\n# The following line prevents the package from being accidentally published to\n# pub.dev using `pub publish`. This is preferred for private packages.\npublish_to: 'none' # Remove this line if you wish to publish to pub.dev\n\n# The following defines the version and build number for your application.\n# A version number is three numbers separated by dots, like 1.2.43\n# followed by an optional build number separated by a +.\n# Both the version and the builder number may be overridden in flutter\n# build by specifying --build-name and --build-number, respectively.\n# In Android, build-name is used as versionName while build-number used as versionCode.\n# Read more about Android versioning at https://developer.android.com/studio/publish/versioning\n# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.\n# Read more about iOS versioning at\n# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html\nversion: 1.0.0+1\n\nenvironment:\n  sdk: \">=2.12.0 <3.0.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  g_faraday:\n    path: ../\n\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: ^1.0.1\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n\n# For information on the generic Dart part of this file, see the\n# following page: https://dart.dev/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\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.dev/assets-and-images/#resolution-aware.\n\n  # For details regarding adding assets from package dependencies, see\n  # https://flutter.dev/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.dev/custom-fonts/#from-packages\n"
  },
  {
    "path": "example_objc_only/test/widget_test.dart",
    "content": "\n"
  },
  {
    "path": "g_faraday.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" inherit-compiler-output=\"true\">\n    <exclude-output />\n    <content url=\"file://$MODULE_DIR$\">\n      <sourceFolder url=\"file://$MODULE_DIR$/lib\" isTestSource=\"false\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.dart_tool\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.idea\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/build\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/.pub\" />\n      <excludeFolder url=\"file://$MODULE_DIR$/example/build\" />\n    </content>\n    <orderEntry type=\"sourceFolder\" forTests=\"false\" />\n    <orderEntry type=\"library\" name=\"Dart Packages\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Dart SDK\" level=\"project\" />\n    <orderEntry type=\"library\" name=\"Flutter Plugins\" level=\"project\" />\n  </component>\n</module>"
  },
  {
    "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.generated/\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/Generated.xcconfig\n/Flutter/flutter_export_environment.sh"
  },
  {
    "path": "ios/Assets/.gitkeep",
    "content": ""
  },
  {
    "path": "ios/Classes/Faraday.swift",
    "content": "//\n//  Faraday.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/2.\n//\n\nimport Foundation\nimport Flutter\n\n/// Manager flutter native viewcontroller push&pop、present&dissmis\n@objc(FFNavigationDelegate)\npublic protocol FaradayNavigationDelegate {\n    \n    \n    /// flutter widget request `open`(push or present) a new native viewcontroller\n    /// - Parameters:\n    ///   - name: native or flutter route name\n    ///   - arguments: route arguments\n    /// - Returns: pushed viewController\n    func push(_ name: String, arguments: Any?, options: Options, callback token: CallbackToken)\n    \n    /// flutter widget require disbale native swipeback func\n    /// - Parameter disable: disable or not\n    @objc\n    optional func disableHorizontalSwipePopGesture(_ disable: Bool)\n    \n    /// flutter widget request pop(dismiss) current FaradayFlutterViewcontroller\n    /// - Parameters:\n    ///   - viewController: current viewcontroller attached on engine\n    /// - Returns: pop succeed or not\n    @objc\n    optional func pop(_ viewController: FaradayFlutterViewController) -> Bool\n}\n\n// 兼容 objc\n//public extension FaradayNavigationDelegate {\n//\n//    func disableHorizontalSwipePopGesture(_ disable: Bool) {\n//        Faraday.default.currentFlutterViewController?.disableHorizontalSwipePopGesture(disable: disable)\n//    }\n//\n//    func pop(_ viewController: FaradayFlutterViewController) -> Bool {\n//        if (viewController.fa.isModal) {\n//            viewController.dismiss(animated: true, completion: nil)\n//        } else {\n//            viewController.navigationController?.popViewController(animated: true)\n//        }\n//        return true\n//    }\n//}\n\n@objc(FFHttpProvider)\npublic protocol FaradayHttpProvider {\n    \n    func request(method: String, url: String, parameters: [String: Any]?, headers: [String: String]?, completion: @escaping (_ result: Any?) -> Void) -> Void\n}\n\npublic typealias FaradayHandler = (_ name: String, _ arguments: Any?, _ completion: @escaping (_ result: Any?) -> Void) -> Void\n\n/**\n \n    核心类，负责管理`Flutter Engine、ViewController`以及其他一些辅助功能主要包含`net、common`\n\n*/\n\npublic class Faraday {\n    \n    public static let `default` = Faraday()\n    \n    private init() {\n        debugPrint(\"🚀🚀Faraday default instance initailed !\")\n    }\n    \n    private weak var navigatorDelegate: FaradayNavigationDelegate? // not retain\n    private weak var netProvider: FaradayHttpProvider?\n    \n    private var commonHandler: FaradayHandler?\n    \n    private var channel: FlutterMethodChannel?\n    private var netChannel: FlutterMethodChannel?\n    private var commonChannel: FlutterMethodChannel?\n    \n    fileprivate var notificationChannel: FlutterMethodChannel?\n    \n    public private(set) var engine: FlutterEngine?\n    \n    private var callbackCache = [UUID: FlutterResult]()\n    \n    /// 当前attach在Engine的viewController 不一定可见\n    public var currentFlutterViewController: FaradayFlutterViewController? {\n        return engine?.viewController as? FaradayFlutterViewController\n    }\n    \n    //\n    func setup(messenger: FlutterBinaryMessenger) {\n        \n        channel = FlutterMethodChannel(name: \"g_faraday\", binaryMessenger: messenger)\n        channel?.resizeBuffer(2)\n        \n        channel?.setMethodCallHandler({ [unowned self] (call, result) in\n            if (call.method == \"pushNativePage\") {\n                self.push(native: call.arguments, callback: result)\n            } else if (call.method == \"popContainer\") {\n                self.pop(flutterContainer: call.arguments, callback: result)\n            } else if (call.method == \"disableHorizontalSwipePopGesture\") {\n                self.disableHorizontalSwipePopGesture(arguments: call.arguments, callback: result)\n            } else if (call.method == \"reCreateLastPage\") {\n                let vc = self.currentFlutterViewController\n                result(vc?.id)\n                vc?.createFlutterPage()\n            }\n        })\n        \n        notificationChannel = FlutterMethodChannel(name: \"g_faraday/notification\", binaryMessenger: messenger)\n        notificationChannel?.setMethodCallHandler({ (call, result) in\n            NotificationCenter.default.post(name: .init(rawValue: call.method), object: call.arguments)\n            result(true)\n        })\n        \n        netChannel = FlutterMethodChannel(name: \"g_faraday/net\", binaryMessenger: messenger)\n        netChannel?.setMethodCallHandler({ [unowned self] (call, r) in\n            if let np = self.netProvider {\n                let args = call.arguments as? [String: Any]\n                \n                let method = call.method; // REQUEST/GET/PUT/POST/DELETE\n                guard let url = args?[\"url\"] as? String else {\n                    r(FlutterError(code: \"1\", message: \"url must not be null\", details: args))\n                    return\n                }\n                \n                let parameters = args?[\"parameters\"] as? [String: Any]\n                let headers = args?[\"headers\"] as? [String: String]\n                \n                np.request(method: method, url: url, parameters: parameters, headers: headers, completion: r)\n            }\n        })\n        \n        \n        if let h = commonHandler {\n            commonChannel = FlutterMethodChannel(name: \"g_faraday/common\", binaryMessenger: messenger)\n            commonChannel?.setMethodCallHandler({ (call, r) in\n                h(call.method, call.arguments, r)\n            })\n        }\n        \n        if let rawEngine = messenger as? FlutterEngine {\n            if (engine == nil || engine != rawEngine) {\n                engine = rawEngine\n            }\n        }\n    }\n    \n    /// 入口方法，用于启动Flutter Engine、 注册插件\n    /// - Parameters:\n    ///   - navigatorDelegate: native 侧路由代理\n    ///   - automaticallyRegisterPlugins: 是否自动注册插件，如果不自动注册请及时手动注册所有插件\n    ///\n    public func startFlutterEngine(navigatorDelegate: FaradayNavigationDelegate,\n                                   httpProvider: FaradayHttpProvider? = nil,\n                                   commonHandler: FaradayHandler? = nil,\n                                   automaticallyRegisterPlugins: Bool = true,\n                                   entrypoint: String = \"main\") {\n        self.navigatorDelegate = navigatorDelegate\n        self.netProvider = httpProvider\n        self.commonHandler = commonHandler\n        \n        engine = FlutterEngine(name: \"io.flutter.faraday\", project: nil, allowHeadlessExecution: true)\n        \n        // 1.1 run\n        guard engine!.run(withEntrypoint: entrypoint) else {\n            fatalError(\"run FlutterEngine failed\")\n        }\n        \n        if (automaticallyRegisterPlugins) {\n            guard let clazz: AnyObject = NSClassFromString(\"GeneratedPluginRegistrant\") else {\n                fatalError(\"missing GeneratedPluginRegistrant\")\n            }\n            \n            let registerSelector: Selector = Selector((\"registerWithRegistry:\"))\n            let _ = clazz.perform(registerSelector, with: engine)\n        }\n    }\n   \n    /// 强制刷新某个 `FaradayFlutterViewController` 实例的渲染状态。 一般情况下不需要调用此方法。\n    /// 推荐在FaradayFlutterViewController生命周期没有按照预期执行的时候调用\n    /// 例如 在iOS13 以上从FaradayFlutterViewController `present`新页面的时候 生命周期调用不符合预期\n    /// - Parameter viewController: 需要刷新状态的FaradayFlutterViewController实例\n    public static func refreshViewController(_ viewController: FaradayFlutterViewController) {\n        viewController.engine?.viewController = nil\n        \n        viewController.viewWillAppear(false)\n        viewController.viewDidLayoutSubviews()\n        viewController.viewDidAppear(false)\n    }\n    \n    public static func callback(_ token: CallbackToken?, result: Any?) {\n        if let t = token {\n            if let cb = Faraday.default.callbackCache.removeValue(forKey: t) {\n                cb(result)\n            }\n        }\n    }\n  \n    func push(native arguments: Any?, callback: @escaping FlutterResult) {\n        guard let arg = arguments as? Dictionary<String, Any>, let name = arg[\"name\"] as? String else {\n            fatalError(\"arguments invalid\")\n        }\n        \n        let token = UUID()\n        // 这里是有可能打开一个 flutter页面的\n        navigatorDelegate?.push(name, arguments: arg[\"arguments\"], options: Options(arg[\"options\"] as? [String: Any]), callback: token)\n        callbackCache[token] = callback\n    }\n    \n    func pop(flutterContainer arguments: Any?, callback: FlutterResult) {\n        guard let viewController = currentFlutterViewController else {\n            debugPrint(\"[Faraday] Error current flutter viewController not found. can't pop\");\n            callback(false)\n            return\n        }\n        viewController.callbackValueToCreator(arguments)\n        \n        // callbackToken != nil 说明这是一个通过 flutter页面打开的一个新引擎， 需要手动调用callback以传值给flutter端\n        if (viewController.callbackToken != nil) {\n            viewController.fa.callback(result: arguments)\n        }\n        \n        if let fn = navigatorDelegate?.pop {\n            callback(fn(viewController))\n        } else {\n            if (viewController.fa.isModal) {\n                viewController.dismiss(animated: true, completion: nil)\n            } else {\n                viewController.navigationController?.popViewController(animated: true)\n            }\n            callback(true)\n        }\n    }\n    \n    func disableHorizontalSwipePopGesture(arguments: Any?, callback: FlutterResult) {\n        let disable = arguments as? Bool ?? false\n        if navigatorDelegate?.disableHorizontalSwipePopGesture != nil {\n            navigatorDelegate?.disableHorizontalSwipePopGesture?(disable)\n        } else {\n            currentFlutterViewController?.disableHorizontalSwipePopGesture(disable: disable)\n        }\n        callback(true)\n    }\n    \n}\n\n// 处理 page 生命周期相关内容\nextension Faraday {\n\n    enum PageState {\n        \n        case create(String, Any?, Int, Bool) // name, arguments, seq, backgroundmode\n        case show(Int) // id\n//        case hiden(Int) // id\n        case dealloc(Int) //id\n        \n        var info: (String, Any?) {\n            switch self {\n            case .create(let name, let arguments, let id, let backgroundClear):\n                return (\"pageCreate\", [\"name\": name, \"args\": arguments, \"id\": id, \"background_mode\": backgroundClear ? \"transparent\" : \"opaque\"])\n            case .show(let id):\n                return (\"pageShow\", id)\n//            case .hiden(let seq):\n//                return (\"pageHidden\", seq)\n            case .dealloc(let id):\n                return (\"pageDealloc\", id)\n            }\n        }\n    }\n    \n    static func sendPageState(_ state: Faraday.PageState, result: @escaping (Bool) -> Void) {\n        let faraday = Faraday.default\n        let info = state.info;\n        faraday.channel?.invokeMethod(info.0, arguments: info.1, result: { r in\n            if (r is FlutterError) {\n                fatalError((r as! FlutterError).message ?? \"unkonwn error\")\n            } else {\n                result(r as? Bool ?? false)\n            }\n        })\n    }\n}\n\n// 发送通知\npublic extension Faraday {\n    \n    /// 发送通知到 Flutter\n    /// Flutter 可以通过 NotificationListener<NotificationListener> 来监听\n    func postNotification(_ name: String, arguments: Any? = nil) {\n        guard notificationChannel != nil else {\n            fatalError(\"start flutter engine before push notification.\")\n        }\n        notificationChannel?.invokeMethod(name, arguments: arguments)\n    }\n}\n\n"
  },
  {
    "path": "ios/Classes/FaradayExtended.swift",
    "content": "//\n//  FaradayExtend.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/21.\n//\n\nimport Foundation\n\npublic struct FaradayExtension<ExtendedType> {\n    /// Stores the type or meta-type of any extended type.\n    public private(set) var type: ExtendedType\n\n    /// Create an instance from the provided value.\n    ///\n    /// - Parameter type: Instance being extended.\n    public init(_ type: ExtendedType) {\n        self.type = type\n    }\n}\n\n/// Protocol describing the `fa` extension points for Faraday extended types.\npublic protocol FaradayExtended {\n    /// Type being extended.\n    associatedtype ExtendedType\n\n    /// Static Faraday extension point.\n    static var fa: FaradayExtension<ExtendedType>.Type { get set }\n    /// Instance Faraday extension point.\n    var fa: FaradayExtension<ExtendedType> { get set }\n}\n\npublic extension FaradayExtended {\n    /// Static Faraday extension point.\n    static var fa: FaradayExtension<Self>.Type {\n        get { FaradayExtension<Self>.self }\n        set {}\n    }\n\n    /// Instance Faraday extension point.\n    var fa: FaradayExtension<Self> {\n        get { FaradayExtension(self) }\n        set {}\n    }\n}\n\nextension UIViewController: FaradayExtended { }\nextension NotificationCenter: FaradayExtended { }\n"
  },
  {
    "path": "ios/Classes/FaradayFlutterViewController.swift",
    "content": "//\n//  FaradayFlutterViewController.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/2.\n//\n\nimport UIKit\nimport Flutter\n\n@objc(FFViewController)\nopen class FaradayFlutterViewController: FlutterViewController, UINavigationControllerDelegate {\n    \n    public let name: String\n    public let arguments: Any?\n    \n    let backgroundClear: Bool\n    \n    let id: Int\n    \n    private var callback: ((Any?) -> ())?\n    \n    private var isShowing = false\n    private weak var previousFlutterViewController: FaradayFlutterViewController?\n    private var swipeBackIsEnable = true\n    \n    @objc\n    public init(_ name: String, arguments: Any? = nil, backgroundClear: Bool = false, engine: FlutterEngine? = nil, callback: ((Any?) -> ())? = nil) {\n        self.name = name\n        self.arguments = arguments\n        self.backgroundClear = backgroundClear\n        self.callback = callback\n        \n        guard let rawEngine = engine ?? Faraday.default.engine else {\n            fatalError(\"Faraday engine must not be nil\")\n        }\n                \n        previousFlutterViewController = rawEngine.viewController as? FaradayFlutterViewController\n        rawEngine.viewController = nil\n        \n        self.id = rawEngine.fa.generateNewId()\n        super.init(engine: rawEngine, nibName: nil, bundle: nil)\n        modalPresentationStyle = .overFullScreen\n        isShowing = true\n        createFlutterPage()\n    }\n    \n    required public init(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    func createFlutterPage() {\n        Faraday.sendPageState(.create(name, arguments, id, backgroundClear)) { _ in }\n    }\n    \n    weak var interactivePopGestureRecognizerDelegate: UIGestureRecognizerDelegate?\n        \n    public func disableHorizontalSwipePopGesture(disable: Bool) {\n        //\n        // 这里不能无脑设置为 !disable 具体原因：\n        //\n        // ref: https://stackoverflow.com/questions/36503224/ios-app-freezes-on-pushviewcontroller\n        //\n        if ((navigationController?.viewControllers.count ?? 0) > 1) {\n            navigationController?.interactivePopGestureRecognizer?.isEnabled = !disable\n        }\n    }\n    \n    public func callbackValueToCreator(_ value: Any?) {\n        if let cb = callback {\n          cb(value)\n          callback = nil\n        }\n    }\n    \n    open override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = backgroundClear ? .clear : .white\n        navigationController?.delegate = self\n    }\n    \n    open override func viewWillAppear(_ animated: Bool) {\n        engine?.viewController = self\n        isShowing = true\n        Faraday.sendPageState(.show(id)) { _ in }\n        super.viewWillAppear(animated)\n        view.backgroundColor = backgroundClear ? .clear : .white\n        \n        if #available(iOS 11.0, *) {\n            additionalSafeAreaInsets = .zero\n        }\n    }\n    \n    open override func viewDidAppear(_ animated: Bool) {\n        interactivePopGestureRecognizerDelegate = navigationController?.interactivePopGestureRecognizer?.delegate\n        navigationController?.interactivePopGestureRecognizer?.delegate = nil\n        let isEnabled = navigationController?.interactivePopGestureRecognizer?.isEnabled ?? false\n        navigationController?.interactivePopGestureRecognizer?.isEnabled = false\n        if (isEnabled && (navigationController?.viewControllers.count ?? 0) > 1) {\n            navigationController?.interactivePopGestureRecognizer?.isEnabled = true\n        }\n        \n        super.viewDidAppear(animated)\n    }\n    \n    public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {\n        if (navigationController.viewControllers.count > 1) {\n            navigationController.interactivePopGestureRecognizer?.isEnabled = navigationController.interactivePopGestureRecognizer?.isEnabled ?? false\n        } else {\n            navigationController.interactivePopGestureRecognizer?.isEnabled = false\n        }\n    }\n    \n    open override func viewWillDisappear(_ animated: Bool) {\n        if let p = previousFlutterViewController, p.isShowing {\n            Faraday.refreshViewController(p)\n        }\n        super.viewWillDisappear(animated)\n    }\n    \n    open override func viewDidDisappear(_ animated: Bool) {\n        //\n        // ref: https://stackoverflow.com/questions/36503224/ios-app-freezes-on-pushviewcontroller\n        //\n        navigationController?.interactivePopGestureRecognizer?.delegate = interactivePopGestureRecognizerDelegate\n        navigationController?.interactivePopGestureRecognizer?.isEnabled = (navigationController?.viewControllers.count ?? 0) > 1\n        \n        isShowing = false\n//        Faraday.sendPageState(.hiden(id)) { r in\n//            let succeed = r as? Bool ?? false\n//            debugPrint(\"id: \\(id) send pageState `hiden` \\(succeed ? \"succeed\" : \"failed\")\")\n//        }\n        super.viewDidDisappear(animated)\n    }\n    \n    // 处理有多个 FlutterViewController的情况\n    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        if (Faraday.default.currentFlutterViewController != self) {\n            Faraday.refreshViewController(self)\n        }\n        super.touchesBegan(touches, with: event)\n    }\n    \n    deinit {\n        Faraday.sendPageState(.dealloc(id)) { _ in }\n        debugPrint(\"faraday flutter deinit \\(name) \\(id)\")\n    }\n}\n"
  },
  {
    "path": "ios/Classes/FlutterEngine+Identifier.swift",
    "content": "//\n//  FlutterEngine+Identifier.swift\n//  g_faraday\n//\n//  Created by gix on 2020/11/19.\n//\n\nimport Flutter\n\nprivate struct AssociatedKeys {\n    static var IdentifierKeyName = \"faraday_IdentifierKeyName\"\n}\n\nextension FaradayExtension where ExtendedType: FlutterEngine {\n    \n    internal var id: Int? {\n        get {\n            return objc_getAssociatedObject(UIViewController.self, &AssociatedKeys.IdentifierKeyName) as? Int\n        }\n        nonmutating set {\n            if let newValue = newValue {\n                objc_setAssociatedObject(UIViewController.self, &AssociatedKeys.IdentifierKeyName, newValue as Int?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            }\n        }\n    }\n    \n    func generateNewId() -> Int {\n        id = (id ?? 0) + 1\n        return id!\n    }\n}\n\nextension FlutterEngine: FaradayExtended { }\n"
  },
  {
    "path": "ios/Classes/GFaradayPlugin.h",
    "content": "#import <Flutter/Flutter.h>\n\n@interface GFaradayPlugin : NSObject<FlutterPlugin>\n@end\n"
  },
  {
    "path": "ios/Classes/GFaradayPlugin.m",
    "content": "#import \"GFaradayPlugin.h\"\n#if __has_include(<g_faraday/g_faraday-Swift.h>)\n#import <g_faraday/g_faraday-Swift.h>\n#else\n// Support project import fallback if the generated compatibility header\n// is not copied when this plugin is created as a library.\n// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816\n#import \"g_faraday-Swift.h\"\n#endif\n\n@implementation GFaradayPlugin\n+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {\n  [SwiftGFaradayPlugin registerWithRegistrar:registrar];\n}\n@end\n"
  },
  {
    "path": "ios/Classes/NotificationCenter+Faraday.swift",
    "content": "//\n//  NotificationCenter+Faraday.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/24.\n//\n\nimport Foundation\n\npublic extension FaradayExtension where ExtendedType: NotificationCenter {\n    \n    // post notification to flutter engine\n    // Flutter 可以通过 FaradayNotificationListener 来监听\n    static func post(name: String, object arguments: Any? = nil) {\n        Faraday.default.postNotification(name, arguments: arguments)\n    }\n}\n"
  },
  {
    "path": "ios/Classes/Options.swift",
    "content": "//\n//  Options.swift\n//  g_faraday\n//\n//  Created by gix on 2020/12/29.\n//\n\nimport Foundation\n\n@objc\npublic class Options: NSObject {\n    \n    let raw: [String: Any]?\n    \n    init(_ value: [String: Any]?) {\n        raw = value\n    }\n    \n    public var animated: Bool {\n        return get(key: \"_faraday.animated\", defaultValue: true)\n    }\n    \n    public var present: Bool {\n        return get(key: \"_faraday.present\", defaultValue: false)\n    }\n    \n    public var isFlutterRoute: Bool {\n        return get(key: \"_faraday.flutter\", defaultValue: false)\n    }\n    \n    public func get<T>(key: String, defaultValue: T) -> T {\n        return raw?[key] as? T ?? defaultValue\n    }\n}\n"
  },
  {
    "path": "ios/Classes/SwiftGFaradayPlugin.swift",
    "content": "import Flutter\nimport UIKit\n\npublic class SwiftGFaradayPlugin: NSObject, FlutterPlugin {\n    public static func register(with registrar: FlutterPluginRegistrar) {\n        Faraday.default.setup(messenger: registrar.messenger())\n    }\n}\n"
  },
  {
    "path": "ios/Classes/UIViewController+Faraday.swift",
    "content": "//\n//  UIViewController+Faraday.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/21.\n//\n\nimport UIKit\n\nprivate struct AssociatedKeys {\n    static var CallbackName = \"faraday_CallbackName\"\n    static var DeallocatorName = \"faraday_DeallocatorName\"\n}\n\npublic typealias CallbackToken = UUID\n\nextension UIViewController {\n    internal var callbackToken: CallbackToken? {\n        get {\n            return objc_getAssociatedObject(self, &AssociatedKeys.CallbackName) as? CallbackToken\n        }\n        set {\n            objc_setAssociatedObject(self, &AssociatedKeys.CallbackName, newValue as CallbackToken?, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n\npublic extension FaradayExtension where ExtendedType: UIViewController {\n           \n    static func automaticallyCallbackNullToFlutter() {\n        swizzle(UIViewController.self, #selector(UIViewController.viewDidLoad), #selector(UIViewController.faraday_viewDidLoad))\n    }\n        \n    var isModal: Bool {\n        if let index = type.navigationController?.viewControllers.firstIndex(of: type), index > 0 {\n            return false\n        } else if type.presentingViewController != nil {\n            if let parent = type.parent, !(parent is UINavigationController || parent is UITabBarController) {\n               return false\n            }\n            return true\n        } else if let navController = type.navigationController, navController.presentingViewController?.presentedViewController == navController {\n            return true\n        } else if type.tabBarController?.presentingViewController is UITabBarController {\n            return true\n        }\n        return false\n    }\n    \n   internal var callbackToken: CallbackToken? {\n        return type.callbackToken\n    }\n    \n    func enableCallback(with token: CallbackToken) {\n        if (type.callbackToken != nil && type.callbackToken == token) {\n            debugPrint(\"⚠️ [g_faraday] update callback token will be lost callback.\")\n        }\n        type.callbackToken = token\n    }\n       \n    /// It's guaranteed to only be called once.\n    ///\n    func callback(result: Any?) {\n        if (type.callbackToken != nil) {\n            Faraday.callback(type.callbackToken, result: result)\n            // 只回调一次\n            type.callbackToken = nil\n        }\n    }\n    \n    func dismiss(withResult result: Any?, animated flag: Bool, completion: (() -> Void)? = nil) {\n        type.fa.callback(result: result)\n        type.dismiss(animated: flag, completion: completion)\n    }\n}\n\nfinal class Deallocator {\n\n    var closure: () -> Void\n\n    init(_ closure: @escaping () -> Void) {\n        self.closure = closure\n    }\n\n    deinit {\n        closure()\n    }\n}\n\nextension UIViewController {\n    \n    @objc fileprivate func faraday_viewDidLoad() {\n        \n        let token = callbackToken\n        let deallocator = Deallocator {\n            // 如果是滑动返回，或者点击左上角back键返回 则需要告诉flutter 没有返回值\n            Faraday.callback(token, result: nil)\n        }\n        \n        objc_setAssociatedObject(self, &AssociatedKeys.DeallocatorName, deallocator, .OBJC_ASSOCIATION_RETAIN)\n        \n        faraday_viewDidLoad()\n    }\n}\n"
  },
  {
    "path": "ios/Classes/UIViewController+Swizzle.swift",
    "content": "//\n//  NavigationController.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/2.\n//\n\nimport UIKit\n\nlet swizzle: (AnyClass, Selector, Selector) -> () = { fromClass, originalSelector, swizzledSelector in\n    guard\n        let originalMethod = class_getInstanceMethod(fromClass, originalSelector),\n        let swizzledMethod = class_getInstanceMethod(fromClass, swizzledSelector)\n        else { return }\n    method_exchangeImplementations(originalMethod, swizzledMethod)\n}\n\n// 当前 ViewController 需要隐藏navigationBar时，需遵循此协议,此外如果是rootVC，则需要单独设置navigationBarHidden\npublic protocol FaradayNavigationBarHiddenProtocol where Self: UIViewController {\n    var isFaradayNavigationBarHidden: Bool { get }\n}\n\nextension FaradayNavigationBarHiddenProtocol {\n    public var isFaradayNavigationBarHidden: Bool {\n        return true\n    }\n}\n// 给 NavigationController 设置默认的bar hidden\npublic protocol FaradayNavigationControllerBarHiddenProtocol where Self: UINavigationController {\n    var isFaradayNavigationBarHidden: Bool { get }\n}\n\nextension FaradayFlutterViewController: FaradayNavigationBarHiddenProtocol { }\n\npublic extension FaradayExtension where ExtendedType: UINavigationController {\n        \n   static func automaticallyHandleNavigationBarHidden() {\n        swizzle(UINavigationController.self, #selector(UINavigationController.pushViewController(_:animated:)), #selector(UINavigationController.faraday_pushViewController(_:animated:)))\n        swizzle(UINavigationController.self, #selector(UINavigationController.popViewController(animated:)), #selector(UINavigationController.faraday_popViewController(animated:)))\n        swizzle(UINavigationController.self, #selector(UINavigationController.popToViewController(_:animated:)), #selector(UINavigationController.faraday_popToViewController(_:animated:)))\n        swizzle(UINavigationController.self, #selector(UINavigationController.popToRootViewController(animated:)), #selector(UINavigationController.faraday_popToRootViewController(animated:)))\n    }\n    \n    @discardableResult\n    func popViewController(withResult result: Any?, animated: Bool) -> UIViewController? {\n        let vc = type.popViewController(animated: animated)\n        vc?.fa.callback(result: result)\n        return vc\n    }\n}\n\nextension UINavigationController {\n    public func navigationBarIsHidden(for viewController: UIViewController?) -> Bool {\n        if let vc = viewController as? FaradayNavigationBarHiddenProtocol {\n            return vc.isFaradayNavigationBarHidden\n        } else if let nav = self as? FaradayNavigationControllerBarHiddenProtocol {\n            return nav.isFaradayNavigationBarHidden\n        } else {\n            return false\n        }\n    }\n    \n    @objc fileprivate func faraday_pushViewController(_ viewController: UIViewController, animated: Bool) {\n        let fromHidden = navigationBarIsHidden(for: viewControllers.last)\n        let toHidden = navigationBarIsHidden(for: viewController)\n        \n        faraday_pushViewController(viewController, animated: animated)\n        if fromHidden != toHidden {\n            setNavigationBarHidden(toHidden, animated: animated)\n        }\n    }\n    \n    @objc fileprivate func faraday_popViewController(animated: Bool) -> UIViewController? {\n        if viewControllers.count <= 1 {\n            return nil\n        }\n        let fromHidden = navigationBarIsHidden(for: viewControllers.last)\n        let toHidden = navigationBarIsHidden(for: viewControllers[viewControllers.count - 2])\n        \n        defer {\n            if fromHidden != toHidden {\n                setNavigationBarHidden(toHidden, animated: animated)\n            }\n        }\n        \n        return faraday_popViewController(animated: animated)\n    }\n    \n    @objc fileprivate func faraday_popToViewController(_ viewController: UIViewController, animated: Bool) -> [UIViewController]? {\n        if viewControllers.count <= 1 {\n            return nil\n        }\n        let fromHidden = navigationBarIsHidden(for: viewControllers.last)\n        let toHidden = navigationBarIsHidden(for: viewController)\n        \n        defer {\n            if fromHidden != toHidden {\n                setNavigationBarHidden(toHidden, animated: animated)\n            }\n        }\n        \n        return faraday_popToViewController(viewController, animated: animated)\n    }\n    \n    @objc fileprivate func faraday_popToRootViewController(animated: Bool) -> [UIViewController]? {\n        if viewControllers.count <= 1 {\n            return nil\n        }\n        let fromHidden = navigationBarIsHidden(for: viewControllers.last)\n        let toHidden = navigationBarIsHidden(for: viewControllers.first)\n        \n        defer {\n            if fromHidden != toHidden {\n                setNavigationBarHidden(toHidden, animated: animated)\n            }\n        }\n        return faraday_popToRootViewController(animated: animated)\n    }\n}\n"
  },
  {
    "path": "ios/Classes/UIViewController+TopMost.swift",
    "content": "//\n//  UIViewController+TopMost.swift\n//  g_faraday\n//\n//  Created by gix on 2020/9/21.\n//\n\nimport UIKit\n\npublic extension FaradayExtension where ExtendedType: UIViewController {\n    \n    private static var sharedApplication: UIApplication? {\n        return UIApplication.shared\n    }\n    \n    /// Returns the current application's top most view controller.\n    static var topMost: UIViewController? {\n        guard let currentWindows = self.sharedApplication?.windows else { return nil }\n        var rootViewController: UIViewController?\n        for window in currentWindows {\n            if let windowRootViewController = window.rootViewController, window.isKeyWindow {\n                rootViewController = windowRootViewController\n                break\n            }\n        }\n        \n        return self.topMost(of: rootViewController)\n    }\n    \n    /// Returns the top most view controller from given view controller's stack.\n    static func topMost(of viewController: UIViewController?) -> UIViewController? {\n        // presented view controller\n        if let presentedViewController = viewController?.presentedViewController {\n            return self.topMost(of: presentedViewController)\n        }\n        \n        // UITabBarController\n        if let tabBarController = viewController as? UITabBarController,\n            let selectedViewController = tabBarController.selectedViewController {\n            return self.topMost(of: selectedViewController)\n        }\n        \n        // UINavigationController\n        if let navigationController = viewController as? UINavigationController,\n            let visibleViewController = navigationController.visibleViewController {\n            return self.topMost(of: visibleViewController)\n        }\n        \n        // UIPageController\n        if let pageViewController = viewController as? UIPageViewController,\n            pageViewController.viewControllers?.count == 1 {\n            return self.topMost(of: pageViewController.viewControllers?.first)\n        }\n        \n        // child view controller\n        for subview in viewController?.view?.subviews ?? [] {\n            if let childViewController = subview.next as? UIViewController {\n                return self.topMost(of: childViewController)\n            }\n        }\n        \n        return viewController\n    }\n}\n"
  },
  {
    "path": "ios/g_faraday.podspec",
    "content": "#\n# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.\n# Run `pod lib lint g_faraday.podspec' to validate before publishing.\n#\nPod::Spec.new do |s|\n  s.name             = 'g_faraday'\n  s.version          = '0.0.1'\n  s.summary          = 'A new flutter plugin project.'\n  s.description      = <<-DESC\nA new flutter plugin project.\n                       DESC\n  s.homepage         = 'http://example.com'\n  s.license          = { :file => '../LICENSE' }\n  s.author           = { 'Your Company' => 'email@example.com' }\n  s.source           = { :path => '.' }\n  s.source_files = 'Classes/**/*'\n  s.dependency 'Flutter'\n  s.platform = :ios, '8.0'\n\n  # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.\n  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }\n  s.swift_version = '5.0'\nend\n"
  },
  {
    "path": "lib/g_faraday.dart",
    "content": "// json\nexport 'package:g_json/g_json.dart';\n\n// utils\nexport 'src/common/common.dart';\nexport 'src/common/entry.dart';\nexport 'src/common/net.dart';\n// wrapper\nexport 'src/faraday.dart';\n// navigator\nexport 'src/route/navigator.dart';\nexport 'src/route/navigator_ext.dart';\nexport 'src/route/options.dart';\n// notification\nexport 'src/widgets/notification_listener.dart';\n"
  },
  {
    "path": "lib/src/common/common.dart",
    "content": "// ignore_for_file: public_member_api_docs\n\nimport 'package:flutter/services.dart';\n\nconst _channel = MethodChannel('g_faraday/common');\n\nclass FaradayCommon {\n  const FaradayCommon();\n\n  static Future<T?> invokeMethod<T>(String method, [dynamic arguments]) {\n    return _channel.invokeMethod(method, arguments);\n  }\n\n  static Future<List<T>?> invokeListMethod<T>(String method,\n      [dynamic arguments]) {\n    return _channel.invokeListMethod(method, arguments);\n  }\n\n  static Future<Map<K, V>?> invokeMapMethod<K, V>(String method,\n      [dynamic arguments]) {\n    return _channel.invokeMapMethod(method, arguments);\n  }\n}\n\n// decorate class\nconst common = FaradayCommon();\n\nclass _FaradayCommonIgnoreMethod {\n  const _FaradayCommonIgnoreMethod();\n}\n\n// decorate method\nconst ignore = _FaradayCommonIgnoreMethod();\n"
  },
  {
    "path": "lib/src/common/entry.dart",
    "content": "// ignore_for_file: public_member_api_docs\n\nclass _FaradayEntry {\n  final bool onlyFlutter;\n\n  const _FaradayEntry({required this.onlyFlutter});\n}\n\nconst entry = _FaradayEntry(onlyFlutter: false);\nconst flutterEntry = _FaradayEntry(onlyFlutter: true);\n"
  },
  {
    "path": "lib/src/common/net.dart",
    "content": "import 'package:flutter/services.dart';\n\nconst _channel = MethodChannel('g_faraday/net');\n\n///\nclass FaradayNet {\n  ///\n  static Future request(String method, String url,\n      {Map<String, dynamic>? parameters, Map<String, dynamic>? headers}) {\n    return _channel.invokeMethod(method, {\n      'url': url,\n      if (parameters != null) 'parameters': parameters,\n      if (headers != null) 'headers': headers\n    });\n  }\n}\n"
  },
  {
    "path": "lib/src/faraday.dart",
    "content": "import 'package:flutter/cupertino.dart';\n\nimport '../g_faraday.dart';\nimport 'route/native_bridge.dart';\nimport 'route/route.dart';\n\n/// 核心入口类\nclass Faraday {\n  /// 备用 后续会创建faraday注解\n  const Faraday();\n\n  static GlobalKey<FaradayNativeBridgeState>? _key;\n\n  /// 最上层 navigator\n  static FaradayNavigatorState? get topMostNavigator =>\n      _key?.currentState?.topNavigator?.currentState;\n\n  /// 最上层 context\n  static BuildContext? get topContext =>\n      _key?.currentState?.topNavigator?.currentContext;\n\n  ///刷新页面\n  void refresh() {\n    _key?.currentState?.recreateLastPage();\n  }\n\n  ///\n  ///`Flutter Native 容器`: iOS端是指`FlutterViewController` Android端是指\n  ///`FlutterActivity`或者`FlutterFragment`容器初始化时需要指定 `name` 以及 `arguments`\n  ///以下统一简称容器\n  ///\n  ///`Faraday` 内部会为每一个`容器`实例维护一个 [Navigator], 并根据`容器`参数设置 `initialRoute`\n  ///\n  /// 因为内部维护的时一个标准的[Navigator]对象，所以你可以像写一个纯Flutter项目那样进行页面导航以及传递参数\n  ///\n  /// ```dart\n  /// @override\n  /// void onPress() async {\n  ///   final result = await Navigator.of(context).pushNamed('Any Route');\n  ///   log(result.toString());\n  /// }\n  /// ```\n  ///\n  ///同理关闭页面传值也很简单\n  /// ```dart\n  /// @override\n  /// void onPress() async {\n  ///   final result = await Navigator.of(context).pop('Any ...');\n  ///   log(result.toString());\n  /// }\n  /// ```\n  ///\n  Route<dynamic> wrapper(\n    RouteFactory rawFactory, {\n    ColorProvider? nativeContainerBackgroundColorProvider,\n    TransitionBuilderProvider? switchPageAnimation,\n    List<NavigatorObserver>? observers,\n    WidgetBuilder? errorPage,\n  }) {\n    return FaradayPageRouteBuilder(\n      pageBuilder: (context) {\n        _key ??= GlobalKey(debugLabel: 'TopNativeBridge');\n        final page = FaradayNativeBridge(\n          rawFactory,\n          backgroundColorProvider: nativeContainerBackgroundColorProvider,\n          transitionBuilderProvider: switchPageAnimation,\n          observers: observers,\n          errorPage: errorPage,\n          key: _key,\n        );\n        return page;\n      },\n    );\n  }\n}\n\n///\nconst faraday = Faraday();\n"
  },
  {
    "path": "lib/src/route/arg.dart",
    "content": "// ignore_for_file: public_member_api_docs\n\nimport 'package:flutter/widgets.dart';\nimport 'package:g_json/g_json.dart';\n\nimport 'navigator.dart';\nimport 'observer.dart';\n\nclass FaradayArguments {\n  final GlobalKey<FaradayNavigatorState> key;\n  final Object? arguments;\n  final String name;\n  final int id;\n  final bool opaque;\n  final FaradayNavigatorObserver observer;\n\n  FaradayArguments(this.arguments, this.name, this.id,\n      {this.opaque = true, List<NavigatorObserver>? observers})\n      : observer = FaradayNavigatorObserver(observers),\n        key = GlobalKey(debugLabel: 'id: $id');\n\n  JSON get info => JSON({\n        'route': name,\n        'opaque': opaque,\n        if (arguments != null) 'arguments': arguments\n      });\n}\n"
  },
  {
    "path": "lib/src/route/native_bridge.dart",
    "content": "// ignore_for_file: public_member_api_docs\n\nimport 'dart:async';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/rendering.dart';\nimport 'package:flutter/services.dart';\nimport 'package:g_json/g_json.dart';\n\nimport '../widgets/log.dart';\nimport 'arg.dart';\nimport 'navigator.dart';\nimport 'options.dart';\n\ntypedef TransitionBuilderProvider = TransitionBuilder? Function(\n    JSON currentRoute);\n\ntypedef ColorProvider = Color Function(BuildContext context, {JSON? route});\n\nColor _defaultBackgroundColor(BuildContext context, {JSON? route}) {\n  return MediaQuery.of(context).platformBrightness == Brightness.light\n      ? CupertinoColors.white\n      : CupertinoColors.black;\n}\n\n///\n/// backgroundColorProvider\n///\n/// 如果当前页面不为透明背景，默认为根据系统是否黑暗模式默认为 黑/白\n///\n/// transitionBuilderProvider\n///\n/// 页面切换动画，默认返回null 使用native系统默认动画即可，在一下几种场景中需要手动自定义\n///\n///\n/// android\n///\n/// fragment 切换\n/// activity的launch mode 不为 standard 的情况\n///\n/// ios\n/// addChild 或者是 禁用了系统默认动画的情况\nclass FaradayNativeBridge extends StatefulWidget {\n  final RouteFactory onGenerateRoute;\n\n  // 页面默认背景\n  final ColorProvider? backgroundColorProvider;\n\n  // 页面切换动画\n  final TransitionBuilderProvider? transitionBuilderProvider;\n\n  // NavigatorObserver\n  final List<NavigatorObserver>? observers;\n\n  // 路由未找到时展示错误页面\n  final WidgetBuilder? errorPage;\n\n  const FaradayNativeBridge(\n    this.onGenerateRoute, {\n    super.key,\n    this.backgroundColorProvider,\n    this.transitionBuilderProvider,\n    this.observers,\n    this.errorPage,\n  });\n\n  static FaradayNativeBridgeState? of(BuildContext context) {\n    if (context is StatefulElement &&\n        context.state is FaradayNativeBridgeState) {\n      return context.state as FaradayNativeBridgeState;\n    }\n    return context.findAncestorStateOfType<FaradayNativeBridgeState>();\n  }\n\n  @override\n  FaradayNativeBridgeState createState() => FaradayNativeBridgeState();\n}\n\nclass FaradayNativeBridgeState extends State<FaradayNativeBridge> {\n  final List<FaradayArguments> _navigators = [];\n  int? _index;\n  int? _previousNotFoundId;\n\n  final _channel = const MethodChannel('g_faraday');\n\n  @override\n  void initState() {\n    super.initState();\n    _channel.setMethodCallHandler(_handler);\n  }\n\n  void recreateLastPage() async {\n    await _channel.invokeMethod('reCreateLastPage');\n    if (_navigators.isNotEmpty && (_index == null)) {\n      _updateIndex(0);\n    }\n\n    // 如果重建页面500ms 以后还没有显示命令，默认显示首页\n    Timer(const Duration(milliseconds: 500), () {\n      if (_navigators.isNotEmpty && (_index == null)) {\n        _updateIndex(0);\n      }\n    });\n  }\n\n  @override\n  void reassemble() {\n    try {\n      recreateLastPage();\n    } on MissingPluginException catch (_) {\n      log('reCreateLastPage failed !!', level: Level.WARNING);\n    }\n    super.reassemble();\n  }\n\n  @override\n  void dispose() {\n    _navigators.clear();\n    super.dispose();\n  }\n\n  Future<T?> pushNamed<T extends Object?>(\n    String name, {\n    Object? arguments,\n    Options? options,\n  }) async {\n    //\n    return _channel.invokeMethod<T>('pushNativePage', {\n      'name': name,\n      if (options != null) 'options': options.raw,\n      if (arguments != null) 'arguments': arguments\n    });\n  }\n\n  Future<void> pop<T extends Object>(Key key, [T? result]) {\n    assert(_navigators.isNotEmpty);\n    assert(_index != null);\n    assert(_navigators[_index!].key == key);\n\n    return _channel.invokeMethod('popContainer', result);\n  }\n\n  Future<void> disableHorizontalSwipePopGesture({required bool disable}) {\n    log(\"swipe pop gesture ${disable ? 'disabled' : 'enabled'}\");\n    return _channel.invokeMethod('disableHorizontalSwipePopGesture', disable);\n  }\n\n  bool isOnTop(Key key) {\n    if (_index == null) return false;\n    return topNavigator == key;\n  }\n\n  GlobalKey<FaradayNavigatorState>? get topNavigator =>\n      _navigators.isEmpty ? null : _navigators[_index ?? 0].key;\n\n  @override\n  Widget build(BuildContext context) {\n    if (_navigators.isEmpty) {\n      if (kDebugMode) {\n        // 应该弹出警告错误界面\n        const style = TextStyle(\n            color: Color(0xFFFFFF66),\n            fontFamily: 'monospace',\n            fontSize: 14.0,\n            fontWeight: FontWeight.bold);\n        return Container(\n          color: RenderErrorBox.backgroundColor,\n          padding: const EdgeInsets.only(left: 15.0, right: 15.0),\n          child: Center(\n            child: Wrap(\n              direction: Axis.vertical,\n              crossAxisAlignment: WrapCrossAlignment.center,\n              spacing: 5.0,\n              children: [\n                const Text(\n                  'g_faraday 路由栈错误，请确认非 hot-restart 引起',\n                  style: style,\n                ),\n                Text(\n                  'tips: 可以保存当前dart文件，触发 hot-reload 从而快速恢复',\n                  style: style.apply(fontSizeDelta: -2, color: Colors.grey),\n                ),\n                OutlinedButton(\n                  autofocus: true,\n                  onPressed: reassemble,\n                  child: Text('点此恢复', style: style.apply(color: Colors.white)),\n                ),\n              ],\n            ),\n          ),\n        );\n      } else {\n        // return Container(\n        //   color: (widget.backgroundColorProvider ?? _defaultBackgroundColor)\n        //       .call(context),\n        //   alignment: Alignment.center,\n        //   child: null,\n        // );\n        return widget.errorPage?.call(context) ?? _defaultErrorPage(context);\n      }\n    }\n\n    if (_index == null) {\n      log('g_faraday: _index is null.', level: Level.CONFIG);\n    } else {\n      assert(_index! < _navigators.length);\n    }\n\n    final current = _navigators[_index ?? 0];\n    final content = Container(\n      key: ValueKey(_index),\n      color: current.opaque\n          ? (widget.backgroundColorProvider ?? _defaultBackgroundColor)\n              .call(context, route: current.info)\n          : Colors.transparent,\n      child: IndexedStack(\n        index: _index,\n        children: _navigators\n            .map((arg) => _buildPage(context, arg))\n            .toList(growable: false),\n      ),\n    );\n\n    final builder = widget.transitionBuilderProvider?.call(current.info);\n    if (builder == null) return content;\n    return builder(context, content);\n  }\n\n  Widget _defaultErrorPage(BuildContext context) {\n    return Container(\n      color: (widget.backgroundColorProvider ?? _defaultBackgroundColor)\n          .call(context),\n      alignment: Alignment.center,\n      child: null,\n    );\n  }\n\n  Future<bool> _handler(MethodCall call) async {\n    log('g_faraday: method: ${call.method}: ${call.arguments}');\n    switch (call.method) {\n      case 'pageCreate':\n        String name = call.arguments['name'];\n        int id = call.arguments['id'];\n\n        // 通过id查找，当前堆栈中是否存在对应的页面，如果存在 直接显示出来\n        final index = _findIndexBy(id: id);\n        if (index != null) {\n          _updateIndex(index);\n          return true;\n        }\n        final arg = FaradayArguments(\n          call.arguments['args'],\n          name,\n          id,\n          opaque: call.arguments['background_mode'] != 'transparent',\n          observers: widget.observers,\n        );\n        _navigators.add(arg);\n        if (_previousNotFoundId != null) {\n          // show 比 create 先调用\n          _updateIndex(_findIndexBy(id: _previousNotFoundId!));\n        }\n        return true;\n      case 'pageShow':\n        final index = _findIndexBy(id: call.arguments);\n        _previousNotFoundId = index == null ? call.arguments : null;\n        if (_previousNotFoundId != null && _navigators.isNotEmpty) {\n          recreateLastPage();\n        }\n        _updateIndex(index);\n        SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);\n        return index != null;\n      case 'pageDealloc':\n        final index = _findIndexBy(id: call.arguments);\n        assert(index != null, 'page not found seq: ${call.arguments}');\n        assert(index! < _navigators.length);\n        final current = _index == null ? null : _navigators[_index!];\n\n        final arg = _navigators.removeAt(index!);\n        arg.key.currentState?.clean();\n\n        final newIndex = current != null ? _navigators.indexOf(current) : -1;\n        _updateIndex(newIndex == -1\n            ? _navigators.isEmpty\n                ? null\n                : _navigators.length - 1\n            : newIndex);\n        // 此时`native`容器已经`dealloc`了,不会再触发渲染会导致`flutter`侧widget延迟释放\n        // 因此在这里手动触发一次渲染\n        WidgetsBinding.instance.drawFrame();\n        log('''\nTRIGGER `drawFrame` by hand. if you find any bugs please contact me.\nEmail: aoxianglele@icloud.com\nOr\nGithub Issue: https://github.com/gfaraday/g_faraday/issues\n        ''');\n        return true;\n      default:\n        return false;\n    }\n  }\n\n  // 如果找不到返回null，不会返回-1\n  int? _findIndexBy({required int id}) {\n    final index = _navigators.indexWhere((arg) => arg.id == id);\n    return index != -1 ? index : null;\n  }\n\n  void _updateIndex(int? index) {\n    assert(index != -1);\n    setState(() {\n      _index = index;\n      _previousNotFoundId = null;\n\n      if (_index != null && _index! < _navigators.length) {\n        final value = _navigators[_index!]\n            .observer\n            .disableHorizontalSwipePopGesture\n            .value;\n        // 每次切换都需要还原一次配置\n        disableHorizontalSwipePopGesture(disable: value);\n      }\n    });\n  }\n\n  Widget _buildPage(BuildContext context, FaradayArguments arg) {\n    return FaradayNavigator(\n      key: arg.key,\n      arg: arg,\n      initialRoute: arg.name,\n      onGenerateRoute: widget.onGenerateRoute,\n      onGenerateInitialRoutes: (navigator, initialRoute) {\n        assert(initialRoute == arg.name);\n        final settings = RouteSettings(\n          name: initialRoute,\n          arguments: arg.arguments,\n        );\n        final r = widget.onGenerateRoute(settings);\n        return [if (r != null) r];\n      },\n    );\n  }\n}\n"
  },
  {
    "path": "lib/src/route/navigator.dart",
    "content": "// ignore: import_of_legacy_library_into_null_safe\nimport 'package:flutter/widgets.dart';\n\nimport '../widgets/log.dart';\nimport 'arg.dart';\nimport 'native_bridge.dart';\nimport 'observer.dart';\n\n/// FaradayNavigator is a root widget for each native container\nclass FaradayNavigator extends Navigator {\n  ///\n  final FaradayArguments arg;\n\n  ///\n  FaradayNavigator(\n      {super.key,\n      super.onPopPage,\n      required String super.initialRoute,\n      required super.onGenerateInitialRoutes,\n      required RouteFactory super.onGenerateRoute,\n      super.onUnknownRoute,\n      DefaultTransitionDelegate super.transitionDelegate,\n      required this.arg,\n      List<NavigatorObserver>? observers})\n      : super(observers: [\n          arg.observer,\n          if (observers != null) ...observers,\n        ]);\n\n  @override\n  FaradayNavigatorState createState() => FaradayNavigatorState();\n\n  ///\n  static FaradayNavigatorState of(BuildContext context) {\n    if (context is StatefulElement && context.state is FaradayNavigatorState) {\n      return context.state as FaradayNavigatorState;\n    }\n    final faraday = context.findAncestorStateOfType<FaradayNavigatorState>();\n    assert(faraday != null);\n    return faraday!;\n  }\n}\n\n///\nclass FaradayNavigatorState extends NavigatorState {\n  late _FaradayWidgetsBindingObserver? _observerForAndroid;\n\n  bool _cleaning = false;\n\n  @override\n  FaradayNavigator get widget => super.widget as FaradayNavigator;\n\n  ///\n  FaradayNavigatorObserver get observer => widget.arg.observer;\n\n  @override\n  void initState() {\n    observer.disableHorizontalSwipePopGesture\n        .addListener(_notifyNativeDisableOrEnableBackGesture);\n    _observerForAndroid = _FaradayWidgetsBindingObserver(this);\n    WidgetsBinding.instance.addObserver(_observerForAndroid!);\n    super.initState();\n  }\n\n  @override\n  void dispose() {\n    observer.disableHorizontalSwipePopGesture\n        .removeListener(_notifyNativeDisableOrEnableBackGesture);\n    if (_observerForAndroid != null) {\n      WidgetsBinding.instance.removeObserver(_observerForAndroid!);\n      _observerForAndroid = null;\n    }\n    super.dispose();\n  }\n\n  ///\n  void _notifyNativeDisableOrEnableBackGesture() {\n    FaradayNativeBridge.of(context)?.disableHorizontalSwipePopGesture(\n        disable: observer.disableHorizontalSwipePopGesture.value);\n  }\n\n  @override\n  Future<T?> pushNamed<T extends Object?>(String routeName,\n      {Object? arguments}) {\n    try {\n      return super.pushNamed(routeName, arguments: arguments);\n      // ignore: avoid_catching_errors\n    } on FlutterError catch (e) {\n      log('g_faraday FaradayNavigator $e', level: Level.WARNING);\n      log('fallback to native. name: $routeName, arguments: $arguments');\n\n      final bridge = FaradayNativeBridge.of(context);\n      assert(bridge != null);\n      return bridge!.pushNamed<T>(routeName, arguments: arguments);\n    }\n  }\n\n  /// pop all routes\n  void clean() {\n    _cleaning = true;\n    super.popUntil((route) => false);\n  }\n\n  @override\n  void pop<T extends Object?>([T? result]) {\n    if (observer.onlyOnePage) {\n      super.pop();\n      if (!_cleaning) {\n        FaradayNativeBridge.of(context)?.pop<Object>(widget.arg.key, result);\n      }\n    } else {\n      super.pop(result);\n    }\n  }\n\n  @override\n  Future<bool> maybePop<T extends Object?>([T? result]) async {\n    final r = await super.maybePop(result);\n    if (!r && observer.onlyOnePage) {\n      pop(result);\n      return true;\n    }\n    return r;\n  }\n}\n\nclass _FaradayWidgetsBindingObserver extends WidgetsBindingObserver {\n  final FaradayNavigatorState navigator;\n\n  _FaradayWidgetsBindingObserver(this.navigator);\n\n  @override\n  Future<bool> didPopRoute() async {\n    final bridge = FaradayNativeBridge.of(navigator.context);\n    assert(bridge != null);\n    if (!bridge!.isOnTop(navigator.widget.arg.key)) {\n      return false;\n    }\n    return await navigator.maybePop();\n  }\n}\n"
  },
  {
    "path": "lib/src/route/navigator_ext.dart",
    "content": "import 'package:flutter/widgets.dart';\nimport 'package:g_json/g_json.dart';\n\nimport 'native_bridge.dart';\nimport 'navigator.dart';\nimport 'options.dart';\n\n///\nextension NavigatorStateX on NavigatorState {\n  /// pop native flutter container\n  Future<void> nativePop<T extends Object>([T? result]) {\n    final bridge = FaradayNativeBridge.of(context);\n    if (bridge != null) {\n      final key = FaradayNavigator.of(context).widget.arg.key;\n      return bridge.pop(key, result);\n    }\n    throw 'FaradayNativeBridge not found !! $context';\n  }\n\n  /// push native flutter container\n  Future<T?> nativePushNamed<T extends Object>(String routeName,\n      {Object? arguments, Options? options}) {\n    final bridge = FaradayNativeBridge.of(context);\n    if (bridge != null) {\n      return bridge.pushNamed<T?>(routeName,\n          arguments: arguments, options: options);\n    }\n\n    throw 'FaradayNativeBridge not found !! $context';\n  }\n}\n\n/// extension route settings\nextension FaradayRouteSettings on RouteSettings {\n  ///\n  /// eg:\n  /// final arg = settings.toJson;\n  /// final id = arg.id;\n  /// final name = arg.name;\n  /// final types = arg.types;\n  ///\n  dynamic get toJson => JSON(arguments);\n}\n"
  },
  {
    "path": "lib/src/route/observer.dart",
    "content": "import 'package:flutter/widgets.dart';\n\n// ignore_for_file: public_member_api_docs\nclass FaradayNavigatorObserver extends NavigatorObserver {\n  final List<NavigatorObserver> _proxyObservers;\n\n  FaradayNavigatorObserver([List<NavigatorObserver>? proxyObservers])\n      : _proxyObservers = proxyObservers ?? [];\n\n  int _pageNumInStack = 0;\n\n  bool get onlyOnePage => _pageNumInStack == 1;\n\n  ValueNotifier<bool> get disableHorizontalSwipePopGesture =>\n      _disableHorizontalSwipePopGesture;\n\n  final _disableHorizontalSwipePopGesture = ValueNotifier<bool>(false);\n\n  @override\n  void didPush(Route route, Route? previousRoute) {\n    _increment(route);\n    for (final po in _proxyObservers) {\n      assert(po.navigator == null,\n          \"don't attach this observer to another navigator\");\n      po.didPush(route, previousRoute);\n    }\n  }\n\n  @override\n  void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {\n    _update(page: _pageNumInStack, route: newRoute);\n    for (final po in _proxyObservers) {\n      assert(po.navigator == null,\n          \"don't attach this observer to another navigator\");\n      po.didReplace(newRoute: newRoute, oldRoute: oldRoute);\n    }\n  }\n\n  @override\n  void didPop(Route route, Route? previousRoute) {\n    _decrement(previousRoute);\n    for (final po in _proxyObservers) {\n      assert(po.navigator == null,\n          \"don't attach this observer to another navigator\");\n      po.didPop(route, previousRoute);\n    }\n  }\n\n  @override\n  void didRemove(Route route, Route? previousRoute) {\n    for (final po in _proxyObservers) {\n      assert(po.navigator == null,\n          \"don't attach this observer to another navigator\");\n      po.didRemove(route, previousRoute);\n    }\n    _decrement(previousRoute);\n  }\n\n  void _increment(Route route) {\n    _update(page: _pageNumInStack + 1, route: route);\n  }\n\n  void _decrement(Route? route) {\n    _update(page: _pageNumInStack - 1, route: route);\n  }\n\n  void _update({required int page, Route? route}) {\n    _pageNumInStack = page;\n    Future.delayed(const Duration(milliseconds: 200)).then((_) {\n      if (route is ModalRoute) {\n        _disableHorizontalSwipePopGesture.value =\n            route.popDisposition == RoutePopDisposition.pop || !onlyOnePage;\n      } else {\n        _disableHorizontalSwipePopGesture.value = !onlyOnePage;\n      }\n    });\n  }\n}\n"
  },
  {
    "path": "lib/src/route/options.dart",
    "content": "import 'package:g_json/g_json.dart';\n\n///\nclass Options {\n  final JSON _raw;\n\n  /// raw options\n  Map<String, dynamic> get raw => _raw.mapObject ?? {};\n\n  ///\n  Options([Map<String, dynamic>? value]) : _raw = JSON(value ?? {});\n\n  /// enable/disable animation\n  void disableAnimation() => add(key: '_faraday.animated', value: false);\n\n  /// show container with/without present\n  void present() => add(key: '_faraday.present', value: true);\n\n  /// is flutter route\n  void flutterRoute() => add(key: '_faraday.flutter', value: true);\n\n  /// add more options\n  void add({required String key, required dynamic value}) {\n    _raw[key] = value;\n  }\n}\n"
  },
  {
    "path": "lib/src/route/route.dart",
    "content": "import 'package:flutter/cupertino.dart';\n\n// ignore: public_member_api_docs\nclass FaradayPageRouteBuilder<T> extends PageRouteBuilder<T> {\n  // ignore: public_member_api_docs\n  FaradayPageRouteBuilder({\n    super.settings,\n    required WidgetBuilder pageBuilder,\n  }) : super(\n            transitionDuration: const Duration(microseconds: 0),\n            pageBuilder: (context, _, __) => pageBuilder(context),\n            maintainState: true);\n\n  @override\n  Future<RoutePopDisposition> willPop() {\n    return Future.value(RoutePopDisposition.bubble);\n  }\n}\n"
  },
  {
    "path": "lib/src/widgets/debugger.dart",
    "content": "/*\nimport 'package:flutter/widgets.dart';\n\n/// Debugger todo:\nclass FaradayDebugger extends StatefulWidget {\n  const FaradayDebugger({Key? key}) : super(key: key);\n\n  @override\n  _FaradayDebuggerState createState() => _FaradayDebuggerState();\n}\n\nclass _FaradayDebuggerState extends State<FaradayDebugger> {\n  @override\n  Widget build(BuildContext context) {\n    return Container(\n      alignment: Alignment.center,\n      child: const Text('Debugger'),\n    );\n  }\n}\n*/"
  },
  {
    "path": "lib/src/widgets/log.dart",
    "content": "import 'dart:developer' as developer;\n\n// ignore: public_member_api_docs\nclass Level {\n  // ignore: public_member_api_docs\n  final String name;\n\n  /// Unique value for this level. Used to order levels, so filtering can\n  /// exclude messages whose level is under certain value.\n  final int value;\n\n  // ignore: public_member_api_docs\n  const Level(this.name, this.value);\n\n  /// Key for static configuration messages ([value] = 700).\n  // ignore: constant_identifier_names\n  static const Level CONFIG = Level('CONFIG', 700);\n\n  /// Key for informational messages ([value] = 800).\n  // ignore: constant_identifier_names\n  static const Level INFO = Level('INFO', 800);\n\n  /// Key for potential problems ([value] = 900).\n  // ignore: constant_identifier_names\n  static const Level WARNING = Level('WARNING', 900);\n}\n\n// ignore: public_member_api_docs\nvoid log(String message,\n    {Level level = Level.CONFIG, String name = 'g_faraday'}) {\n  assert(() {\n    developer.log(\n      message,\n      level: level.value,\n      name: name,\n      time: DateTime.now(),\n    );\n    return true;\n  }());\n}\n"
  },
  {
    "path": "lib/src/widgets/notification_listener.dart",
    "content": "import 'dart:async';\n\nimport 'package:flutter/foundation.dart';\nimport 'package:flutter/services.dart';\nimport 'package:flutter/widgets.dart';\nimport 'package:g_json/g_json.dart';\n\nimport '../route/native_bridge.dart';\nimport 'log.dart';\n\n///\nconst _notificationChannel = MethodChannel('g_faraday/notification');\nvar _notificationChannelEnabled = false;\n\nfinal _notificationController =\n    StreamController<FaradayNotification>.broadcast(onListen: () {\n  log('_notificationController onlListened');\n}, onCancel: () {\n  log('_notificationController onCanceled', level: Level.WARNING);\n});\n\nStreamSubscription _observerNativeNotification(\n    List<String> names, ValueChanged<FaradayNotification> onNotification) {\n  return _notificationController.stream.listen((event) {\n    if (names.contains(event.name)) onNotification(event);\n  });\n}\n\nFuture<bool> _handler(MethodCall call) {\n  if (_notificationController.hasListener) {\n    _notificationController.sink\n        .add(FaradayNotification(call.method, call.arguments));\n    return Future.value(true);\n  }\n  return Future.value(false);\n}\n\n/// FaradayNotification dispatched by native channel\nclass FaradayNotification {\n  ///\n  final String name;\n\n  /// must encoding to json\n  final dynamic arguments;\n\n  ///\n  FaradayNotification(this.name, [this.arguments])\n      : assert(name.isNotEmpty),\n        super();\n\n  @override\n  String toString() {\n    if (kDebugMode) {\n      return 'notification: $name: ${JSON(arguments).prettyString()}';\n    }\n    return super.toString();\n  }\n\n  /// 全局广播此通知\n  void dispatchToGlobal({bool deliverToNative = true}) {\n    if (_notificationController.hasListener) {\n      _notificationController.sink.add(this);\n    }\n    if (deliverToNative) {\n      _notificationChannel.invokeMethod(name, arguments);\n    }\n  }\n}\n\n// ignore: public_member_api_docs\ntypedef NotificationReceivedCallback = void Function(\n    BuildContext? topMostContext, FaradayNotification value);\n\n/// Receive native notification\nclass FaradayNotificationListener extends StatefulWidget {\n  /// 想要监听的通知 名称数组\n  /// 可以同时监听多个通知\n  ///\n  /// eg:\n  ///\n  /// ['ListUpdate', 'Logout']\n  final List<String> names;\n\n  ///\n  final NotificationReceivedCallback onNotification;\n\n  ///\n  final Widget child;\n\n  ///\n  const FaradayNotificationListener(\n    this.names, {\n    super.key,\n    required this.onNotification,\n    required this.child,\n  });\n\n  @override\n  // ignore: library_private_types_in_public_api\n  _FaradayNotificationListenerState createState() =>\n      _FaradayNotificationListenerState();\n}\n\nclass _FaradayNotificationListenerState\n    extends State<FaradayNotificationListener> {\n  StreamSubscription? _streamSubscription;\n\n  @override\n  void initState() {\n    super.initState();\n    if (!_notificationChannelEnabled) {\n      _notificationChannel.setMethodCallHandler(_handler);\n    }\n    _streamSubscription = _observerNativeNotification(widget.names, (value) {\n      final bridge = FaradayNativeBridge.of(context);\n      widget.onNotification(bridge?.topNavigator?.currentContext, value);\n    });\n  }\n\n  @override\n  void dispose() {\n    _streamSubscription?.cancel();\n    super.dispose();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return widget.child;\n  }\n}\n"
  },
  {
    "path": "pubspec.yaml",
    "content": "name: g_faraday\ndescription: A very simple plugin for building hybrid stack apps with flutter\nversion: 1.0.2\nhomepage: https://github.com/gfaraday/g_faraday\n\nenvironment:\n  sdk: \">=3.0.0 <4.0.0\"\n  flutter: \">=3.16.0\"\n\ndependencies:\n  flutter:\n    sdk: flutter\n  g_json: ^4.1.0\n\ndev_dependencies:\n  flutter_test:\n    sdk: flutter\n  flutter_lints: ^3.0.1\n\nflutter:\n  plugin:\n    platforms:\n      android:\n        package: com.yuxiaor.flutter.g_faraday\n        pluginClass: GFaradayPlugin\n      ios:\n        pluginClass: GFaradayPlugin\n"
  }
]