[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9203":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":22,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":42,"readmeContent":43,"aiSummary":44,"trendingCount":16,"starSnapshotCount":16,"syncStatus":45,"lastSyncTime":46,"discoverSource":47},9203,"Fair","wuba\u002FFair","wuba","A Flutter package used to update widget tree dynamically. Fair提供一整套Flutter动态化解决方案","https:\u002F\u002Ffair.58.com",null,"Dart",2741,323,47,62,0,1,29.53,"BSD 3-Clause \"New\" or \"Revised\" License",false,"main",true,[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"android","code-push","dart","dynamic","dynamic-widget","flutter","flutter-app","flutter-apps","flutter-demo","flutter-dynamic","flutter-examples","flutter-fair","flutter-ui","flutter-widget","ios","js","jsx","react-native","2026-06-12 02:02:04","![social preview](resources\u002Fsocial-dark.png)\n\u003C!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fpub.dev\u002Fpackages\u002Ffair\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpub-3.2.1-orange\" alt=\"pub\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-flutter-blue.svg\" alt=\"github\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Ffair.58.com\u002F\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdoc-fair.58.com-green.svg\" alt=\"doc\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-BSD-green.svg\" alt=\"license\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Factions\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fworkflows\u002Fbuild\u002Fbadge.svg\" alt=\"build\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgitter.im\u002Fflutter_fair\u002Fcommunity?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge\">\u003Cimg src=\"https:\u002F\u002Fbadges.gitter.im\u002Fflutter_fair\u002Fcommunity.svg\" alt=\"Gitter\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n[简体中文](README-zh.md)|[English](README.md)\n\n---\n\nFair is a dynamic framework designed for Flutter. Through the automatic conversion of native Dart source files by the Fair Compiler tool, the project can obtain the ability to dynamically update the Widget Tree and State.\n\nThe goal of creating Fair is to support updates through business bundles and JS distribution without the release of versions (Android, iOS, Web), similar to React Native. After integrating with Flutter Fair, you can quickly publish new pages without waiting for your app's next release date. Fair provides standard widgets, which can be used as a new dynamic page or as part of an existing Flutter page, such as typography\u002Fstyle modification of operation bits, full page replacement, partial replacement, etc.\n\n![](resources\u002Fwhat-is-fair-en.png)\n\nFair's UI rendering is lossless and can be restored at the pixel level. Take a look at the effect of escaping some pages of Best Flutter UI Templates:\n\n![best-ui-template](resources\u002Fbest-ui-template.png)\n\n> The project used is from https:\u002F\u002Fgithub.com\u002Fmitesh77\u002FBest-Flutter-UI-Templates \u003C\u002Fbr>\n> location：\u002Fexample\u002Flib\u002Fbest_flutter_ui\n\n## 🏛Architecture\n\n![fair architecture](resources\u002Ffair.png)\n\n## 🚀 Running\nUse Flutter Fair require few steps. \n\n**step1：download fair project source code**\n\nIt is recommended to download [fair](https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair) to the local and dependencies on the relative path. \n\nThe download method is as follows:\n\n```\ngit clone https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair.git\n```\n\n**step2：Add dependency inside `pubspec.yaml`**\n\nAssuming that the fair project and your own project are in the same folder:\n\n```yaml\n# add Fair dependency\ndependencies:\n  fair: 3.2.1\n\n# add build_runner and compiler dependency\ndev_dependencies:\n  build_runner: ^2.0.0\n  fair_compiler: ^1.7.0\n \n# switch \"fair_version\" according to the local Flutter SDK version\n# Flutter SDK 3.7.x(3.7.0、3.7.1、3.7.2、3.7.3、3.7.4、3.7.5、3.7.6、3.7.7、3.7.8、3.7.9、3.7.10) -> flutter_3_7_0\n# Flutter SDK 3.3.x(3.3.0、3.3.1、3.3.2、3.3.3、3.3.4、3.3.5、3.3.6、3.3.7、3.3.8、3.3.9、3.3.10) -> flutter_3_3_0\n# Flutter SDK 3.0.x(3.0.0、3.0.1、3.0.2、3.0.3、3.0.4、3.0.5) -> flutter_3_0_0\n# Flutter SDK 2.10.x(2.10.0、2.10.1、2.10.2、2.10.3) -> flutter_2_10_0\n# Flutter SDK 2.8.x(2.8.0、2.8.1) -> flutter_2_8_0\n# Flutter SDK 2.5.x(2.5.0、2.5.1、2.5.2、2.5.3) -> flutter_2_5_0\n# Flutter SDK 2.0.6 -> flutter_2_0_6\n# Flutter SDK 1.22.6 -> flutter_1_22_6\ndependency_overrides:\n  fair_version:\n    path: ..\u002Ffair\u002Fflutter_version\u002Fflutter_3_7_0\n```\n\n**step3：Wrap your app with FairApp Widget**\n\n```dart\nvoid main() {\n  WidgetsFlutterBinding.ensureInitialized();\n\n  FairApp.runApplication(\n    _getApp(),\n    plugins: {\n    },\n  );\n}\n\ndynamic _getApp() => FairApp(\n  modules: {\n  },\n  delegate: {\n  },\n  child: MaterialApp(\n    home: FairWidget(\n            name: 'DynamicWidget',\n            path: 'assets\u002Fbundle\u002Flib_src_page_dynamic_widget.fair.json',\n            data: {\"fairProps\": json.encode({})}),\n  ),\n);\n```\n\n**step4：Import a dynamic widget as FairWidget**\n\n```dart\nFairWidget(\n  name: 'DynamicWidget',\n  path: 'assets\u002Fbundle\u002Flib_src_page_dynamic_widget.fair.json',\n  data: {\"fairProps\": json.encode({})}),\n```\n\n## DevTools\nfair development tools\n### Dart Commandline Tool [faircli](https:\u002F\u002Fpub.dev\u002Fpackages\u002Ffaircli)\n\ncreate fair project\n\n**faircli install**\n```dart\ndart pub global activate faircli\n```\n\n**create fair dynamic project**\n```dart\nfaircli create -n dynamic_project_name\n```\n**create fair carrier project**\n```dart\nfaircli create -k carrier -n carrier_project_name\n```\n\n### IDEA Plugin [FairTemplate](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F20323-fairtemplate)\n\nPage\u002FComponent Template Code\n\n\u003Chtml>\n\u003Cimg src=\"resources\u002Ffair_template.png\" width=\"80%\">\n\u003C\u002Fhtml>\n\n### DevTools flow chart\n![fair tools](resources\u002Ffair_tools.png)\n\n### DevTools demo\nAfter using faircli to configure the local hot update service, open the developer options on the mobile device, select the local mode, enter the ip of the development machine, then preview fair dynamic effect\n\n\u003Chtml>\n\u003Cdiv align=\"center\">\n\u003Cimg src=\"resources\u002Ffair_tools.gif\" width=\"30%\">\n\u003C\u002Fdiv>\n\u003C\u002Fhtml>\n\nFor more details, please refer to [fair_tools](fair_tools.md)\n\n## Fair-Online Platform\nFair-Online is an integrated cloud development platform for Flutter developers, from online development of Flutter, to real-time compilation and preview, packaging and publishing, and dynamic release of end-side updates, to realize the dynamic online Flutter.\n\nDevelopers do not need to configure the Flutter development environment, develop and debug code online, compile and preview in real time, and what you see is what you get. Combined with the Flutter dynamic framework Fair and the hot update platform FairPushy created by the 58 open source team, Flutter online dynamics are realized.\n\n\u003Chtml>\n\u003Cdiv align=\"center\">\n\u003Cimg src=\".\u002Ffair_online\u002Ffair_online.gif\" width=\"90%\">\n\u003C\u002Fdiv>\n\u003C\u002Fhtml>\n\nOnline experience URL:\n[Fair-Online Platform](https:\u002F\u002Ffair-online.58.com\u002F)\n\nFor more details, please refer to [fair_online](.\u002Ffair_online\u002FREADME.md)\n\n## Documentation\nFor more details, please refer to [https:\u002F\u002Ffair.58.com](https:\u002F\u002Ffair.58.com)  \n### Tools\nFair Cli: [Fair_CLI](https:\u002F\u002Fpub.dev\u002Fpackages\u002Ffaircli)  \nIEDA plugin: [jetbrains_plugin_fair_template](https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F20323-fairtemplate)  \nHot update platform: [FAIR PUSHY](https:\u002F\u002Fgithub.com\u002Fwuba\u002FFairPushy)\n\n## versions\n\n## 3.10.0\nupdateDate: 2023.08.15\n\n- Adapted to Flutter 3.10.0, released Fair Version 3.10\n- Fix known bugs, fix DSL parser issues\n\n### 3.2.1\nupdateDate：2023.04.13\n\n- Fixed some issues.\n\n### 3.2.0\nupdateDate：2023.04.12\n\n- Adjust the order of dispose calls, not above the tree, subsequent operations stop\n- Add generic FairPlugin js and dart code, reuse the same interaction logic, add example comments\n- Json parsing compatibility\n- Add exception catching and log printing when executeFunction is called with V8 engine in Android\n- Fix SliverGridDelegateWithFixedCrossAxisCount conversion error.\n- SugarMap and SugarMapEach inputs support other Sugar expressions\n- Optimize the performance of ifEqual ifEqualBool switchCase\n- Fix Domain not recognizing index and item in sugar\n- Make AOT also follow conditions before executing code\n- Fix SugarMap and SugarMapEach set input does not support other Sugar syntax\n- Abstract Domain, add IndexDomain, MapEachDomain, support nested Domains\n- New FunctionDomain generic Domain, generate corresponding parameters for function callbacks for FunctionDomain to use.\n- Added NullableIndexedWidgetBuilder, IndexedWidgetBuilder, WidgetBuilder, TransitionBuilder common Sugar support\n- Some known issues fixed\n\n### 3.1.0\nupdateDate：2023.03.14\n\n- Upgrade analyzer library to 5.5.0;\n- Dart function to JS supports parameter passing;\n- JS Object value compatibility;\n- Remove kotlin dependencies from fair\u002Fandroid;\n- Add custom parsing for IconData;\n- The generation of optional positional parameters is modified to obtain pa;\n- Fixed missing OptionalPositional default values;\n- Remove the generation time from the generation.fair. dart comment;\n- Added the ignore unnecessary_import operation;\n- Fixed incorrect assignment of Sugar.switchCase key and defaultValue;\n- binding was changed to SplayTreeMap to increase search efficiency, especially for lists, where duplicate tags are searched for a short time;\n- Exposing specialBinding so that users can override a value;\n- When the provider is added to the _binding, the Settings set by the user prevail for quick modification;\n- Fixed the loadCoreJs package splicing problem;\n- Reduced minSdkVersion to 16;\n- runApplication supports specifying the package in which the JS resides;\n- Fixed error in calling context in the _reload method.\n\n### 3.0.0\nupdateDate：2022.11.17\n\n- Fix class constructor parsing exception.\n- Fair Compatible Web.\n- Bindmap logic optimization.\n\n### 2.8.1\nupdateDate：2022.11.01\n\n- Fixed：CustomScrollView reference external function builder bug.\n\n### 2.8.0\nupdateDate：2022.10.21\n\n- Add support of Flutter SDK 3.3.0+.\n- Add Sugar：Sugar.isNestedScrollViewHeaderSliversBuilder、Sugar.isButtonStyle、Sugar.isDuration、Sugar.popMenuButton、Sugar.sliverChildBuilderDelegate、Sugar.sliverGridDelegateWithFixedCrossAxisCount.\n- Fixed some bugs.\n\n### 2.7.0\nupdateDate：2022.08.10\n\n- Add support of Flutter SDK 3.0.0、3.0.1、3.0.2、3.0.3、3.0.4、3.0.5.\n- Fixed some bugs.\n\n#### Fair\n- Fair supports loading bundle files on the phone disk path;\n- Adapt to Flutter SDK 2.10.0, 2.10.1, 2.10.2, 2.10.3;\n- Dart2JS supports parsing static methods;\n- When running, the page error message prompts optimization;\n- Syntactic sugar supports parsing Model data.\n\n### 2.6.0\nupdateDate：2022.07.05\n\n#### Fair\n- Fair supports loading bundle files on the phone disk path;\n- Adapt to Flutter SDK 2.10.0, 2.10.1, 2.10.2, 2.10.3;\n- Dart2JS supports parsing static methods;\n- When running, the page error message prompts optimization;\n- Syntactic sugar supports parsing Model data.\n\n### 2.5.0\nupdateDate：2022.05.31\n#### Fair\nAdapt to flutter SDK 2.8.0, 2.8.1  \nDart2js supports parsing singletons  \nNew syntax Sugar.switchCase、Sugar.colorsWithOpacity、Sugar.convertToString, etc  \n#### example\nComprehensively optimize the example structure and upgrade the example experience, which is more suitable for beginners.  \n\nIn the source code, an example project is added to provide the standard usage of fair API.  \n\nexample location：`fair\u002Fexample`\n\n### v2.4.1\nupdateDate：2022.05.12  \n\nFix FairLogger import problem.  \nUpgrade Analyzer to 2.3.0.  \n\n### v2.4.0\nupdateDate：2022.04.26\n\nFlatBuffers supports generating bin files in a null safe environment  \n\n### v2.3.0\nupdateDate: 2022.04.22\n\n#### Fair\nsupports null-safe  \nAdapt to Flutter SDK 2.5.0, 2.5.1, 2.5.2, 2.5.3 and other versions  \n#### demo\nUpgrade the outdated demo in the sample project  \nSupplement the iOS runtime environment in the sample project  \n\n## 🕰2022 Roadmap\n\n* Major release plan\n   * null-safe version support, expected to be launched on April 22 ✅\n   * Flutter 2.8.0 version adaptation, expected to be launched in mid-May ✅\n   * Flutter 2.10.0 version adaptation, is expected to be launched in early June  ✅\n   * Flutter 3.0 version adaptation               ✅\n   * IDE syntax detection and hint plugin ✅\n   * Rich syntactic sugar                 ✅\n* Hot update platform\n   * Dart Server project construction ✅\n   * Flutter Web project construction ✅\n   * Patch\u002Fresource management         ✅\n   * Project management                ✅\n   * Mobile Update&Download           ✅\n* Online dynamic\n   * Flutter Web project construction ✅\n   * Dart Server project construction ✅\n   * ActionEdit                       ✅\n   * Code editing                     ✅\n   * Component editing                ✅\n   * Page editing                     ✅\n   * Engineering editor               ✅\n   * Flutter effect preview           ✅\n   * Fair DSL preview                 ✅\n* IDE plug-in\n   * Fair project generation          ✅\n   * Fair template generation         ✅\n   * Fair syntax detection            ✅\n\n\n## 📱Accessed APPs\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic3.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v303052b2c3f3b4ea5a5989f5e52d71481.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>58阿姨\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic5.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v3ba05182f1dc9460dab8e02d22914f700.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>移动经纪人\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic7.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v35eecf738ac6c4ec992bfc0d1b8d910d4.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>安居拍房\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic1.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v3b4fd1abf1e484d3da864a177a12a28e2.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>神奇保\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic6.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v36e650b70b7834204959547bf616869ef.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>58商办通\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic1.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v378fdb523858b4475b05fb04f66f105ae.jpg\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>58商家版\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Cimg src=\"https:\u002F\u002Fpic6.58cdn.com.cn\u002Fnowater\u002Ffrs\u002Fn_v31394c57d6c234aecad820c94dd1c8dc6.png\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>中华英才网\u003C\u002Fb>\u003C\u002Fsub>\u003Cbr \u002F>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n## ✨Contributors\n\nThanks goes to these wonderful people ([emoji key](https:\u002F\u002Fallcontributors.org\u002Fdocs\u002Fen\u002Femoji-key)):\n\n\u003C!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n\u003C!-- prettier-ignore-start -->\n\u003C!-- markdownlint-disable -->\n\u003Ctable>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgongpengyang\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F11691321?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>gongpengyang\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=gongpengyang\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FXIAOYUAOQISHI\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F25222933?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>qixu\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=XIAOYUAOQISHI\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fyancechen.github.io\u002F\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19757728?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>陈有余\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=yancechen\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyyzl0418\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F14289945?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>yangyang\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=yyzl0418\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwanbing\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7804234?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>wan\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=wanbing\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fbujiee\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16713978?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>bujie\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=bujiee\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwindkc\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F59242966?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Kc\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=windkc\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"http:\u002F\u002Fblog.hacktons.cn\u002F\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1622234?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Wu\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=avenwu\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=avenwu\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FLinLeyang\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13174498?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Penta\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=LinLeyang\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=LinLeyang\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002F153493932\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10431131?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>haijun\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=153493932\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=153493932\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwaynesonic\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5502794?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>waynesonic\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=waynesonic\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpaozhuanyinyu\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16041238?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>paozhuanyinyu\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=paozhuanyinyu\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FAlzzzz\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19664495?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>alzzzz\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=Alzzzz\" title=\"Code\">💻\u003C\u002Fa> \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=Alzzzz\" title=\"Documentation\">📖\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fxiangwc\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22017021?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>xiangwc\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=xiangwc\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FKKProject\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F14860258?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>WangYk\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=KKProject\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJunZiJianYi\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F34125737?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>SunWei\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=JunZiJianYi\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fshanpengtao\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7127463?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>单鹏涛\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=shanpengtao\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Flswc225\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16609338?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>lswc225\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=lswc225\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"http:\u002F\u002Fwww.gaofeiyu.com\u002F\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6150536?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Goofy\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=gaofeiyu\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fitzhaoqian\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F23277488?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>itzhaoqian\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=itzhaoqian\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fxxliang\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F5005255?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Sunlight Xie\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=xxliang\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fa303268287\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F19368353?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>lhdycxgghb\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=a303268287\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhlwhl\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7610615?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Prome\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=hlwhl\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fzmtzawqlp\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16477333?v=4\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>zmtzawqlp\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=zmtzawqlp\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n  \u003Ctr>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fhc2088\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6659505?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>woshixiaohuhu\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=hc2088\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fyukixut\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F45286155?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>yukixut\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=yukixut\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fpearone\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F23350428?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>pearone\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=pearone\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJOYINF1189\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F46019591?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>JOYINF1189\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=JOYINF1189\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FBlues9527\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F35455720?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>Blues9527\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=Blues9527\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmiserydx\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F17892391?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>miserydx\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=miserydx\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n    \u003Ctd align=\"center\">\u003Ca href=\"https:\u002F\u002Fgithub.com\u002FCindyMini\">\u003Cimg src=\"https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16411182?v=4?s=100\" width=\"100px;\" alt=\"\"\u002F>\u003Cbr \u002F>\u003Csub>\u003Cb>CICI Chan\u003C\u002Fb>\u003C\u002Fsub>\u003C\u002Fa>\u003Cbr \u002F>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fcommits?author=CindyMini\" title=\"Code\">💻\u003C\u002Fa>\u003C\u002Ftd>\n  \u003C\u002Ftr>\n\u003C\u002Ftable>\n\n\u003C!-- markdownlint-restore -->\n\u003C!-- prettier-ignore-end -->\n\n\u003C!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https:\u002F\u002Fgithub.com\u002Fall-contributors\u002Fall-contributors) specification. Contributions of any kind welcome!\n\n## 👏🏻Supporters\n\n[![Stargazers repo roster for @wuba\u002Ffair](https:\u002F\u002Freporoster.com\u002Fstars\u002Fwuba\u002Ffair)](https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fstargazers)\n\n[![Forkers repo roster for @wuba\u002Ffair](https:\u002F\u002Freporoster.com\u002Fforks\u002Fwuba\u002Ffair)](https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fnetwork\u002Fmembers)\n\n## 🔧Build together\nSubmit issues through [Issue](https:\u002F\u002Fgithub.com\u002Fwuba\u002Ffair\u002Fissues), contribute code through Pull Request, and the administrator will review the code.\n\nFriends who are interested in Fair can join the exchange group. For technical consultation and discussion, please go to\n\n| WeChat secretary | WeChat group |\n|--------------------------|--------------------------|\n| ![wechat](resources\u002Fweixin.jpeg) | ![wechat_group](resources\u002Fwechat-group-02.png) |\n\n\n## License\n\nCopyright (C) 2005-present, 58.com.  All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and\u002For other materials provided\n      with the distribution.\n    * Neither the name of 58.com nor the names of its\n      contributors may be used to endorse or promote products derived\n      from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n","Fair 是一个用于 Flutter 的动态框架，能够通过自动转换 Dart 源文件来实现 Widget 树和状态的动态更新。其核心功能包括支持业务包与 JS 分发以实现无版本更新（适用于 Android、iOS 和 Web），并提供了一系列标准组件以便快速发布新页面或修改现有页面的部分内容。Fair 保持了 UI 渲染的高保真度，能够在像素级别还原设计效果。该项目非常适合需要频繁迭代且希望减少应用发布周期的移动开发场景，尤其是当开发者希望在不重新发布整个应用的情况下对特定页面进行即时更新时。",2,"2026-06-11 03:21:40","top_language"]