{"id":21383082,"url":"https://github.com/gfaraday/g_faraday","last_synced_at":"2025-04-04T20:13:12.498Z","repository":{"id":40607214,"uuid":"299574522","full_name":"gfaraday/g_faraday","owner":"gfaraday","description":"A plugin for building hybrid stack apps with flutter","archived":false,"fork":false,"pushed_at":"2025-03-18T09:54:53.000Z","size":4387,"stargazers_count":142,"open_issues_count":10,"forks_count":21,"subscribers_count":9,"default_branch":"develop","last_synced_at":"2025-03-28T19:09:06.098Z","etag":null,"topics":["android","dart","faraday","flutter","flutter-boost","ios","kotlin","swift"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gfaraday.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-29T09:54:45.000Z","updated_at":"2025-02-28T02:22:12.000Z","dependencies_parsed_at":"2024-01-26T09:29:19.251Z","dependency_job_id":"927efc7b-5836-4319-9880-cd1a400d717e","html_url":"https://github.com/gfaraday/g_faraday","commit_stats":null,"previous_names":[],"tags_count":59,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gfaraday%2Fg_faraday","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gfaraday%2Fg_faraday/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gfaraday%2Fg_faraday/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gfaraday%2Fg_faraday/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gfaraday","download_url":"https://codeload.github.com/gfaraday/g_faraday/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247242680,"owners_count":20907134,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","dart","faraday","flutter","flutter-boost","ios","kotlin","swift"],"created_at":"2024-11-22T11:19:44.160Z","updated_at":"2025-04-04T20:13:12.477Z","avatar_url":"https://github.com/gfaraday.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ![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\u0026style=for-the-badge)\n![pub_Version](https://img.shields.io/pub/v/g_faraday?include_prereleases\u0026style=for-the-badge\u0026logo=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\u0026logo=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 -\u003e flutter -\u003e 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\u003e 您的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\u003c!-- [iOS下载app](https://github.com/gfaraday/g_faraday/releases/download/0.4.2/example.app.zip)\n\u003e [模拟器安装app](doc/ios-simulator-install.md) --\u003e\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\u003e 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) =\u003e Text('First Page'));\n    case 'second_page':\n        return CupertinoPageRoute(builder: (context) =\u003e Text('Second Page'));\n    }\n    return CupertinoPageRoute(builder: (context) =\u003e Text(settings.name));\n});\n\n// 0x01 将 route 赋给你的app widget\nCupertinoApp(onGenerateRoute: (_) =\u003e route);\n\n// 0x02 flutter 侧集成完毕，接下来你可以选择 集成iOS/Android\n```\n\n\u003e 注意不管是`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\u003cString, *\u003e?): 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\" -\u003e {\n                return Intent(context, FlutterToNativeActivity::class.java)\n            }\n            \"native2flutter\" -\u003e {\n                return Intent(context, Native2FlutterActivity::class.java)\n            }\n            \"tabContainer\" -\u003e {\n                return Intent(context, TabContainerActivity::class.java)\n            }\n            else -\u003e {\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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgfaraday%2Fg_faraday","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgfaraday%2Fg_faraday","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgfaraday%2Fg_faraday/lists"}