From 28341d6776e1f5c18c64b8e96d44b02d4a6d3d88 Mon Sep 17 00:00:00 2001 From: lanhuajian Date: Fri, 8 Sep 2023 15:52:38 +0800 Subject: [PATCH 01/44] [feature] ast_gen/dsl_gen support TypeArgumentList --- dart2dsl/lib/fairdsl/fair_ast_gen.dart | 8 +++++++ dart2dsl/lib/fairdsl/fair_ast_node.dart | 22 +++++++++++++++++++ dart2dsl/lib/fairdsl/fair_check_node_map.dart | 3 ++- dart2dsl/lib/fairdsl/fair_dsl_gen.dart | 12 ++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/dart2dsl/lib/fairdsl/fair_ast_gen.dart b/dart2dsl/lib/fairdsl/fair_ast_gen.dart index f41a9f4c..f40d786f 100644 --- a/dart2dsl/lib/fairdsl/fair_ast_gen.dart +++ b/dart2dsl/lib/fairdsl/fair_ast_gen.dart @@ -385,6 +385,11 @@ class CustomAstVisitor extends SimpleAstVisitor { return _buildArgumentList(_visitNodeList(node.arguments)); } + @override + Map visitTypeArgumentList(TypeArgumentList node) { + return _buildTypeArgumentList(_visitNodeList(node.arguments)); + } + @override Map? visitLabel(Label node) { return _visitNode(node.label); @@ -543,6 +548,9 @@ class CustomAstVisitor extends SimpleAstVisitor { 'body': body, }; + Map _buildTypeArgumentList(List typeArgumentList) => + {'type': 'TypeArgumentList', 'typeArgumentList': typeArgumentList}; + Map _buildArgumentList(List argumentList) => {'type': 'ArgumentList', 'argumentList': argumentList}; Map _buildStringLiteral(String value) => {'type': 'StringLiteral', 'value': value}; diff --git a/dart2dsl/lib/fairdsl/fair_ast_node.dart b/dart2dsl/lib/fairdsl/fair_ast_node.dart index 74269278..3e47c30c 100644 --- a/dart2dsl/lib/fairdsl/fair_ast_node.dart +++ b/dart2dsl/lib/fairdsl/fair_ast_node.dart @@ -432,8 +432,10 @@ class MethodInvocation extends AstNode { Expression? callee; List? argumentList; SelectAstClass? selectAstClass; + List? typeArgumentList; MethodInvocation(this.callee, this.argumentList, this.selectAstClass, + this.typeArgumentList, {Map? ast}) : super(ast: ast); @@ -444,6 +446,7 @@ class MethodInvocation extends AstNode { Expression.fromAst(ast['callee']), _parseArgumentList(ast['argumentList']), SelectAstClass.fromAst(ast['selectAstClass']), + _parseTypeArgumentList(ast['typeArguments']), ast: ast); } return null; @@ -1097,6 +1100,7 @@ class Expression extends AstNode { bool? isVariableDeclaration; bool? isVariableExpression; bool? isFuncParam; + bool? isTypeName; @override Map? toAst() => _ast; @@ -1137,6 +1141,7 @@ class Expression extends AstNode { this.isVariableDeclaration = false, this.isVariableExpression = false, this.isFuncParam =false, + this.isTypeName = false, Map? ast, }) : super(ast: ast); @@ -1237,6 +1242,8 @@ class Expression extends AstNode { isInterpolationExpression: true, ast: ast); } else if (astType == astNodeNameValue(AstNodeName.VariableExpression)) { return Expression(VariableExpression.fromAst(ast), isVariableExpression: true, ast: ast); + } else if (astType == astNodeNameValue(AstNodeName.TypeName)) { + return Expression(TypeName.fromAst(ast), isTypeName: true, ast: ast); } return null; } @@ -1311,6 +1318,8 @@ class Expression extends AstNode { _expression as InterpolationExpression; VariableExpression get asVariableExpression => _expression as VariableExpression; + + TypeName get asTypeNameExpression => _expression as TypeName; } class SelectAstClass { @@ -1350,6 +1359,19 @@ List _parseArgumentList(Map? ast) { return arguments; } +///解析TypeArgumentList 字段 +List _parseTypeArgumentList(Map? ast) { + var arguments = []; + if (ast != null) { + var astTypeArgumentList = ast['typeArgumentList'] as List?; + return astTypeArgumentList + ?.map((arg) => Expression.fromAst(arg)) + .toList() ?? + arguments; + } + return arguments; +} + //num _parseNumericValue(Map ast) { // num n = 0; // if (ast['type'] == astNodeNameValue(AstNodeName.NumericLiteral)) { diff --git a/dart2dsl/lib/fairdsl/fair_check_node_map.dart b/dart2dsl/lib/fairdsl/fair_check_node_map.dart index 5c1aa1a7..834db7e8 100644 --- a/dart2dsl/lib/fairdsl/fair_check_node_map.dart +++ b/dart2dsl/lib/fairdsl/fair_check_node_map.dart @@ -57,5 +57,6 @@ final checkNode = { 'ImplementsClauseImpl': 'visitImplementsClause', 'WithClauseImpl': 'visitWithClause', 'PropertyAccessImpl': 'visitPropertyAccess', - 'PrefixExpressionImpl': 'visitPrefixExpression' + 'PrefixExpressionImpl': 'visitPrefixExpression', + 'TypeArgumentListImpl':'visitTypeArgumentList' }; diff --git a/dart2dsl/lib/fairdsl/fair_dsl_gen.dart b/dart2dsl/lib/fairdsl/fair_dsl_gen.dart index ce91dac6..e4eae548 100644 --- a/dart2dsl/lib/fairdsl/fair_dsl_gen.dart +++ b/dart2dsl/lib/fairdsl/fair_dsl_gen.dart @@ -219,6 +219,7 @@ dynamic _buildWidgetDsl( var dslMap = {}; var paMap = []; var naMap = {}; + var taMap =[]; var methodInvocationExpression = widgetExpression?.asMethodInvocation; //普通类 @@ -309,6 +310,13 @@ dynamic _buildWidgetDsl( } } + //3.ta + if (methodInvocationExpression.typeArgumentList?.isNotEmpty ?? false) { + taMap.addAll(methodInvocationExpression.typeArgumentList + ?.map((ta) => ta?.asTypeNameExpression.name) ?? + []); + } + if (paMap.isNotEmpty) { dslMap.putIfAbsent('pa', () => paMap); } @@ -317,6 +325,10 @@ dynamic _buildWidgetDsl( dslMap.putIfAbsent('na', () => naMap); } + if(taMap.isNotEmpty){ + dslMap.putIfAbsent('typeArgumentList', () => taMap); + } + return dslMap; } From 097fbc81c191733bfc0b779e33075b7523a058fe Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 15 Sep 2023 15:28:44 +0800 Subject: [PATCH 02/44] change qr code --- resources/wechat-group-02.png | Bin 23216 -> 23312 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index 44ed40d030f38e40ba67aa82bc6a955871c511ab..031ab2e2f012d763c5e96446f2f8171513193f8a 100644 GIT binary patch literal 23312 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 literal 23216 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%0A1=T)Uu{43wKK~w zj-?kO8={750At0q>TT~XvgcZ7yX1akAQEUkLnvx+ ze^a{5uxD9FUKTP+Bc3m0;nAvlh+0<*hIotsb!Xehh!Wu69hOrl!+II0Z(Uhda)!9+ zQ+0WL^t93tj%C8XZyP#o6Rn9(T)6UQ7UXjZj5)V~3PubU|KNQ|Am(88NmDfr$HSp+ z>qcQWlM-Uw%BPG-(cTf!3K+^iEJ6_kgPd{~oDSQ8xR8%}`RT|8u4m+r-H7yRB*pKg zSD7Qo_kP{>IfMfNr(E8TF!a@IZzw?PiKJcHnUOG{5%rqUiCCtBuEI-;TE>ax24ZXT zHzf=OU&}XxjMfz`f3m!c5|5}DBBqF#{!CRhk5ILgCyfgvFzGp4;X))QA@{)K!}{DIkKgKq+LJoeZ>5k9zYk0@bMV@eyiMnxPc% zG9u_K902650^cJ*S68>_5YLE2rFi*PE-uO&cHfD{pG>r~-KISbE*=LnT&aK@{nh2? zSw;VyytEX30@jw6a|)3|lj%5%JE$i=x8@)>wkm#^0!^lKJyLW68s+Amn%lVQL?T}c zG)46}7FhqN5(~s5(CFb6B9xb#cmPZh+*-|WFr8Gs<&dFZq2^hI)`%%=0n^qbM7PMf ztk1|UG@*;JNrT`imdvWHT>0DPrOzRKXD@0+fE*5(Rf`EPiNCmqMq&sxMlYfIkVNxE zh0ZzW`s5GVeC0h^27>YnIC+{q6}=mA#zT*!a2C(oE;{xC_ZPhU@C0Pmr+x=oLgrS4 zOUs~BxR&m>BX<(aV(abDwt*OuBwREMY$ZJy9K;z#blW%- zb1!7260f}IRibG|!qfCXh%t5EJ8y4qlc6U9^u6?t)WM(bDe;|)6QaMg(poBvMxzzS z*rsDzVxNheuwlV~?*cNhC<)CQy?DUqy*06t63~s-DA0s?n~Xe_g346rdO-SaHo`8V zRzD@rz3!M0M*$a!67L>bE(qTR+~b#OPvEsD;Oq6OJ}pC*L6$CBXqi~5_@Q8=r^0#- z(j0?)X?8qAJaH|M8%4*d*BH@tDxjybqPC_4Z-=Woa@JOX{MXXq9m$9;ygMnd6Pov1 z-hIY05C!EDCw?~TUq|}l*WY}$cnNvKm=XLH6Pf Date: Fri, 22 Sep 2023 14:20:46 +0800 Subject: [PATCH 03/44] fix js string notemtpy --- dart2js/core-types/string.js | 2 +- fair/assets/fair_core/fair_jsbase.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dart2js/core-types/string.js b/dart2js/core-types/string.js index 3aa56283..57b85bce 100644 --- a/dart2js/core-types/string.js +++ b/dart2js/core-types/string.js @@ -27,7 +27,7 @@ Object.defineProperties(String.prototype, { }, isNotEmpty: { get: function () { - return this.length; + return !this.isEmpty; }, }, // runes: { diff --git a/fair/assets/fair_core/fair_jsbase.js b/fair/assets/fair_core/fair_jsbase.js index 2fc94e72..6086410b 100644 --- a/fair/assets/fair_core/fair_jsbase.js +++ b/fair/assets/fair_core/fair_jsbase.js @@ -1772,7 +1772,7 @@ Object.prototype.__op_idx__ = function (key) { }, isNotEmpty: { get: function () { - return this.length; + return !this.isEmpty; }, }, // runes: { From 7326a9169f8ae0e29291f78c29e193bbe45ca46b Mon Sep 17 00:00:00 2001 From: huchu Date: Fri, 22 Sep 2023 15:53:48 +0800 Subject: [PATCH 04/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9js=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E5=86=85=E5=AD=98=E6=B3=84=E6=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fair/ios/Classes/FairDynamicJSPlugin/FairDartBridge.m | 2 +- fair/lib/src/runtime/runtime_fair_delegate.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/fair/ios/Classes/FairDynamicJSPlugin/FairDartBridge.m b/fair/ios/Classes/FairDynamicJSPlugin/FairDartBridge.m index 463fe9fe..92d73bae 100644 --- a/fair/ios/Classes/FairDynamicJSPlugin/FairDartBridge.m +++ b/fair/ios/Classes/FairDynamicJSPlugin/FairDartBridge.m @@ -87,7 +87,7 @@ - (void)setDartListener { return; } } - callback(@"success"); + callback(@{@"status":@"success"}); }]; } } diff --git a/fair/lib/src/runtime/runtime_fair_delegate.dart b/fair/lib/src/runtime/runtime_fair_delegate.dart index 1412820f..f94f0817 100644 --- a/fair/lib/src/runtime/runtime_fair_delegate.dart +++ b/fair/lib/src/runtime/runtime_fair_delegate.dart @@ -121,5 +121,6 @@ abstract class RuntimeFairDelegate { void dispose() { runtime?.invokeMethod(pageName, 'onUnload', null); + runtime?.invokeMethod(pageName, 'releaseJS', null); } } From b8a5ea846e89ac0b77a99847f97e133ad0bfb6ff Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Thu, 28 Sep 2023 16:09:52 +0800 Subject: [PATCH 05/44] change qr code --- resources/wechat-group-02.png | Bin 23312 -> 23485 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index 031ab2e2f012d763c5e96446f2f8171513193f8a..c29dd7d6db0aa13643cc5a281032630b12d0f0c5 100644 GIT binary patch literal 23485 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 From 5b4fc545c97506b55690fa5c5738c0684d923dce Mon Sep 17 00:00:00 2001 From: lanhuajian Date: Wed, 25 Oct 2023 17:44:41 +0800 Subject: [PATCH 06/44] [feature] Function parameters carry TypeArgumentList --- fair/lib/src/render/builder.dart | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/fair/lib/src/render/builder.dart b/fair/lib/src/render/builder.dart index ec3b7042..53251465 100644 --- a/fair/lib/src/render/builder.dart +++ b/fair/lib/src/render/builder.dart @@ -47,6 +47,7 @@ class DynamicWidgetBuilder extends DynamicBuilder { : super('className', proxyMirror, page, bound, bundle: bundle); @override + @mustCallSuper dynamic convert(BuildContext context, Map map, Map? methodMap, {Domain? domain}) { var name = map[tag]; @@ -185,13 +186,23 @@ class DynamicWidgetBuilder extends DynamicBuilder { }) { var na = named(name, map['na'], methodMap, ctx, domain); var pa = positioned(map['pa'], methodMap, ctx, domain); + var ta = map['typeArgumentList']; // var arguments = map['arguments']; final bind = widget && (na.binding == true || pa.binding == true); try { fun = FairModule.cast(ctx, fun); if (forceApply || !bind) { - return Function.apply( - fun, [Property.extract(list: pa.data, map: na.data)], null); + if (ta != null) { + var properties = {}; + properties['pa'] = pa.data; + properties.addAll(na.data); + properties['ta'] = ta; + return Function.apply( + fun, [Property.extract(data: properties)], null); + } else { + return Function.apply( + fun, [Property.extract(list: pa.data, map: na.data)], null); + } } return FairComponent(name, func: fun, na: na.data, pa: pa.data); } catch (e, stack) { From f7487f9ec2bc192a21496b4f739aaa7685a7c498 Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Wed, 25 Oct 2023 19:44:40 +0800 Subject: [PATCH 07/44] [feature] fair_provider initial development completed --- fair/assets/fair_core/fair_core.js | 37 + fair_provider/.gitignore | 44 ++ fair_provider/.metadata | 33 + fair_provider/README.md | 16 + fair_provider/analysis_options.yaml | 29 + .../assets/plugin/fair_provider_plugin.js | 91 +++ fair_provider/example/.gitignore | 44 ++ fair_provider/example/.metadata | 33 + fair_provider/example/README.md | 16 + fair_provider/example/analysis_options.yaml | 29 + fair_provider/example/android/.gitignore | 13 + .../example/android/app/build.gradle | 71 ++ .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 34 + .../fair_provider/example/MainActivity.kt | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 8 + fair_provider/example/android/build.gradle | 31 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + fair_provider/example/android/settings.gradle | 11 + .../fair/lib_ui_counter_page_provider.fair.js | 19 + .../lib_ui_counter_page_provider.fair.json | 206 +++++ ...lib_ui_counter_page_provider.fair.metadata | 7 + fair_provider/example/ios/.gitignore | 34 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Release.xcconfig | 2 + fair_provider/example/ios/Podfile | 41 + fair_provider/example/ios/Podfile.lock | 28 + .../ios/Runner.xcodeproj/project.pbxproj | 553 +++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 87 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + fair_provider/example/ios/Runner/Info.plist | 51 ++ .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/lib/entity/counter_model.dart | 14 + .../example/lib/entity/login_model.dart | 8 + fair_provider/example/lib/main.dart | 131 ++++ .../example/lib/ui/counter_page_provider.dart | 114 +++ fair_provider/example/pubspec.lock | 725 ++++++++++++++++++ fair_provider/example/pubspec.yaml | 39 + fair_provider/example/test/widget_test.dart | 30 + fair_provider/lib/fair_provider.dart | 4 + fair_provider/lib/src/fair_app_module.dart | 46 ++ fair_provider/lib/src/fair_provider_core.dart | 468 +++++++++++ .../lib/src/fair_provider_plugin.dart | 44 ++ .../src/provider_dynamic_widget_builder.dart | 145 ++++ fair_provider/lib/src/utils/time_record.dart | 21 + fair_provider/pubspec.lock | 717 +++++++++++++++++ fair_provider/pubspec.yaml | 40 + 87 files changed, 4500 insertions(+) create mode 100644 fair_provider/.gitignore create mode 100644 fair_provider/.metadata create mode 100644 fair_provider/README.md create mode 100644 fair_provider/analysis_options.yaml create mode 100644 fair_provider/assets/plugin/fair_provider_plugin.js create mode 100644 fair_provider/example/.gitignore create mode 100644 fair_provider/example/.metadata create mode 100644 fair_provider/example/README.md create mode 100644 fair_provider/example/analysis_options.yaml create mode 100644 fair_provider/example/android/.gitignore create mode 100644 fair_provider/example/android/app/build.gradle create mode 100644 fair_provider/example/android/app/src/debug/AndroidManifest.xml create mode 100644 fair_provider/example/android/app/src/main/AndroidManifest.xml create mode 100644 fair_provider/example/android/app/src/main/kotlin/com/wuba/fair/fair_provider/example/MainActivity.kt create mode 100644 fair_provider/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 fair_provider/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 fair_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 fair_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 fair_provider/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 fair_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 fair_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 fair_provider/example/android/app/src/main/res/values-night/styles.xml create mode 100644 fair_provider/example/android/app/src/main/res/values/styles.xml create mode 100644 fair_provider/example/android/app/src/profile/AndroidManifest.xml create mode 100644 fair_provider/example/android/build.gradle create mode 100644 fair_provider/example/android/gradle.properties create mode 100644 fair_provider/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 fair_provider/example/android/settings.gradle create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata create mode 100644 fair_provider/example/ios/.gitignore create mode 100644 fair_provider/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 fair_provider/example/ios/Flutter/Debug.xcconfig create mode 100644 fair_provider/example/ios/Flutter/Release.xcconfig create mode 100644 fair_provider/example/ios/Podfile create mode 100644 fair_provider/example/ios/Podfile.lock create mode 100644 fair_provider/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 fair_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 fair_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 fair_provider/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 fair_provider/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 fair_provider/example/ios/Runner/AppDelegate.swift create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 fair_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 fair_provider/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 fair_provider/example/ios/Runner/Info.plist create mode 100644 fair_provider/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 fair_provider/example/lib/entity/counter_model.dart create mode 100644 fair_provider/example/lib/entity/login_model.dart create mode 100644 fair_provider/example/lib/main.dart create mode 100644 fair_provider/example/lib/ui/counter_page_provider.dart create mode 100644 fair_provider/example/pubspec.lock create mode 100644 fair_provider/example/pubspec.yaml create mode 100644 fair_provider/example/test/widget_test.dart create mode 100644 fair_provider/lib/fair_provider.dart create mode 100644 fair_provider/lib/src/fair_app_module.dart create mode 100644 fair_provider/lib/src/fair_provider_core.dart create mode 100644 fair_provider/lib/src/fair_provider_plugin.dart create mode 100644 fair_provider/lib/src/provider_dynamic_widget_builder.dart create mode 100644 fair_provider/lib/src/utils/time_record.dart create mode 100644 fair_provider/pubspec.lock create mode 100644 fair_provider/pubspec.yaml diff --git a/fair/assets/fair_core/fair_core.js b/fair/assets/fair_core/fair_core.js index d8538f3a..1ac1ee44 100644 --- a/fair/assets/fair_core/fair_core.js +++ b/fair/assets/fair_core/fair_core.js @@ -58,6 +58,18 @@ function _invokeMethod(par) { if (isNull(func)) { methodResult = ''; } else { + if (Array.isArray(args)) { + for (let key in args) { + if (args.hasOwnProperty(key)) { + const value = args[key]; + if (typeof value === 'object') { + invokeMethodArgsInterceptorManager.handle(value) + } + } + } + } else { + console.log('_invokeMethod intercept failed, args is not array'); + } methodResult = func.apply(mClass, args); } let result = { @@ -183,4 +195,29 @@ const invokeFlutterCommonChannel = (invokeData, callback) => { }); }; +class InvokeMethodArgsInterceptorManager { + constructor() { + this.interceptors = []; + } + + // 注册拦截器 + use(interceptor) { + if (typeof interceptor === 'function') { + this.interceptors.push(interceptor); + } + } + + // 处理对象 + handle(object) { + for (const interceptor of this.interceptors) { + // 如果有拦截器返回 true,则停止处理并返回结果 + if (interceptor(object) === true) { + return object; + } + } + return object; + } +} +// 创建一个拦截器管理器实例 +const invokeMethodArgsInterceptorManager = new InvokeMethodArgsInterceptorManager(); \ No newline at end of file diff --git a/fair_provider/.gitignore b/fair_provider/.gitignore new file mode 100644 index 00000000..24476c5d --- /dev/null +++ b/fair_provider/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/fair_provider/.metadata b/fair_provider/.metadata new file mode 100644 index 00000000..397befcd --- /dev/null +++ b/fair_provider/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: android + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: ios + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/fair_provider/README.md b/fair_provider/README.md new file mode 100644 index 00000000..517d64bb --- /dev/null +++ b/fair_provider/README.md @@ -0,0 +1,16 @@ +# fair_provider + +An extension library for Fair on the Provider framework. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/fair_provider/analysis_options.yaml b/fair_provider/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/fair_provider/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/fair_provider/assets/plugin/fair_provider_plugin.js b/fair_provider/assets/plugin/fair_provider_plugin.js new file mode 100644 index 00000000..3f84671a --- /dev/null +++ b/fair_provider/assets/plugin/fair_provider_plugin.js @@ -0,0 +1,91 @@ +let FairChangeNotifierPool = {}; + +let FairProviderPlugin = class FairProviderPlugin { + + static create(key, initialJson) { + if (!FairChangeNotifierPool[key]) { + let fairChangeNotifier + try { + fairChangeNotifier = JSON.parse(initialJson); + } catch (e) { + fairChangeNotifier = {} + } + console.log("miseryy 创建model key = " + key) + FairChangeNotifierPool[key] = fairChangeNotifier; + fairChangeNotifier.fairRuntimeTypeKey = key; + fairChangeNotifier.notify = function () { + let paramsMap = {}; + paramsMap['fairRuntimeTypeKey'] = this.fairRuntimeTypeKey + paramsMap['jsonMap'] = JSON.stringify(this) + let requestParameter = {}; + requestParameter['className'] = "FairProvider#notifyListeners"; + requestParameter['funcName'] = 'invokePlugin'; + requestParameter['args'] = paramsMap; + requestParameter['pageName'] = '#FairKey#'; + let map = JSON.stringify(requestParameter); + invokeFlutterCommonChannel(map, (resultStr) => { + }) + } + fairChangeNotifier.print = function () { + console.log("misery " + this.fairRuntimeTypeKey + "👇🏻") + console.log(this) + } + } + } + + static find(className) { + //如果FairChangeNotifierPool中有key为className的value,则直接返回value + //没有则创建FairChangeNotifier并以className为key存入FairChangeNotifierPool + if (!FairChangeNotifierPool[className]) { + FairChangeNotifierPool[className] = new FairChangeNotifier(className); + } + return FairChangeNotifierPool[className]; + } + + static evaluation(className, evaluation) { + if (!FairChangeNotifierPool[className]) { + FairChangeNotifierPool[className] = new FairChangeNotifier(className) + } + let fairChangeNotifier = FairChangeNotifierPool[className] + let temp + eval("temp = fairChangeNotifier." + evaluation) + return temp + } + + static release() { + //TODO + } + +} + +GLOBAL["FairProviderPlugin"] = FairProviderPlugin; + +invokeMethodArgsInterceptorManager.use((object) => { + if (object.hasOwnProperty("id") && object["id"] === "FairContext") { + object.read = function (name) { + //从treeModelKeyRecords数组中找到startwith(name)的元素 + return FairChangeNotifierPool[findFirstMatchedElement(this.treeModelKeyRecords, name)]; + } + return true; + } +}) + +function findFirstMatchedElement(treeModelKeyRecords, name) { + let latestMatchedElement = null; + + for (let i = 0; i < treeModelKeyRecords.length; i++) { + const element = treeModelKeyRecords[i]; + + // 使用正则表达式提取元素中的名称部分 + const match = element.match(/(.+)_(\d+)/); + + if (match && match[1] === name) { + latestMatchedElement = element; + break; // 找到匹配项后,结束循环 + } + } + + return latestMatchedElement; +} + + diff --git a/fair_provider/example/.gitignore b/fair_provider/example/.gitignore new file mode 100644 index 00000000..24476c5d --- /dev/null +++ b/fair_provider/example/.gitignore @@ -0,0 +1,44 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/fair_provider/example/.metadata b/fair_provider/example/.metadata new file mode 100644 index 00000000..397befcd --- /dev/null +++ b/fair_provider/example/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled. + +version: + revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + channel: stable + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: android + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + - platform: ios + create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/fair_provider/example/README.md b/fair_provider/example/README.md new file mode 100644 index 00000000..2b3fce4c --- /dev/null +++ b/fair_provider/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/fair_provider/example/analysis_options.yaml b/fair_provider/example/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/fair_provider/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/fair_provider/example/android/.gitignore b/fair_provider/example/android/.gitignore new file mode 100644 index 00000000..6f568019 --- /dev/null +++ b/fair_provider/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/fair_provider/example/android/app/build.gradle b/fair_provider/example/android/app/build.gradle new file mode 100644 index 00000000..d6fa3163 --- /dev/null +++ b/fair_provider/example/android/app/build.gradle @@ -0,0 +1,71 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.wuba.fair.fair_provider.example" + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/fair_provider/example/android/app/src/debug/AndroidManifest.xml b/fair_provider/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..c1f315f8 --- /dev/null +++ b/fair_provider/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/fair_provider/example/android/app/src/main/AndroidManifest.xml b/fair_provider/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..da8302cc --- /dev/null +++ b/fair_provider/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + diff --git a/fair_provider/example/android/app/src/main/kotlin/com/wuba/fair/fair_provider/example/MainActivity.kt b/fair_provider/example/android/app/src/main/kotlin/com/wuba/fair/fair_provider/example/MainActivity.kt new file mode 100644 index 00000000..fa754924 --- /dev/null +++ b/fair_provider/example/android/app/src/main/kotlin/com/wuba/fair/fair_provider/example/MainActivity.kt @@ -0,0 +1,6 @@ +package com.wuba.fair.fair_provider.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/fair_provider/example/android/app/src/main/res/drawable-v21/launch_background.xml b/fair_provider/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/fair_provider/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/fair_provider/example/android/app/src/main/res/drawable/launch_background.xml b/fair_provider/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/fair_provider/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/fair_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/fair_provider/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/fair_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/fair_provider/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/fair_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/fair_provider/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/fair_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/fair_provider/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/fair_provider/example/android/app/src/main/res/values-night/styles.xml b/fair_provider/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/fair_provider/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/fair_provider/example/android/app/src/main/res/values/styles.xml b/fair_provider/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/fair_provider/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/fair_provider/example/android/app/src/profile/AndroidManifest.xml b/fair_provider/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..c1f315f8 --- /dev/null +++ b/fair_provider/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + diff --git a/fair_provider/example/android/build.gradle b/fair_provider/example/android/build.gradle new file mode 100644 index 00000000..58a8c74b --- /dev/null +++ b/fair_provider/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.2.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/fair_provider/example/android/gradle.properties b/fair_provider/example/android/gradle.properties new file mode 100644 index 00000000..94adc3a3 --- /dev/null +++ b/fair_provider/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/fair_provider/example/android/gradle/wrapper/gradle-wrapper.properties b/fair_provider/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..3c472b99 --- /dev/null +++ b/fair_provider/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/fair_provider/example/android/settings.gradle b/fair_provider/example/android/settings.gradle new file mode 100644 index 00000000..44e62bcf --- /dev/null +++ b/fair_provider/example/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js new file mode 100644 index 00000000..2f3a565b --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js @@ -0,0 +1,19 @@ +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _CounterPageProviderState(){const inner=_CounterPageProviderState.__inner__;if(this==__global__){return new _CounterPageProviderState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_CounterPageProviderState.prototype.ctor.apply(this,args);return this;}}_CounterPageProviderState.__inner__=function inner(){this.title="我是写在js侧的title";this.counterModelJson=`{ + "count":22, + "testName":"zzzzzz", + "someModel":{ + "a":"ffffff" + } +} + `;this.loginModelJson=` { + "account":"qwerty12345", + "password":"zxcv54321" +} + `;this.counterModelJson2=`{ + "count":333, + "testName":"testName的初始值", + "someModel":{ + "a":"someModel中a的初始值" + } +} + `;};_CounterPageProviderState.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_incrementCounter:function _incrementCounter(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let counterModel=context.read("CounterModel");counterModel.count++;counterModel.testName="及哦飞机佛IE我房间";counterModel.someModel.a="hahahaha";counterModel.notify();}}},};_CounterPageProviderState.prototype.ctor=function(){};;return _CounterPageProviderState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json new file mode 100644 index 00000000..41f7932f --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json @@ -0,0 +1,206 @@ +{ + "className": "FairChangeNotifierProvider", + "na": { + "initialJson": "^(counterModelJson)", + "child": { + "className": "FairChangeNotifierProvider", + "na": { + "initialJson": "^(loginModelJson)", + "child": { + "className": "FairChangeNotifierProvider", + "na": { + "initialJson": "^(counterModelJson2)", + "child": { + "className": "Scaffold", + "na": { + "appBar": { + "className": "AppBar", + "na": { + "title": { + "className": "Text", + "pa": [ + "^(title)" + ] + } + } + }, + "body": { + "className": "Center", + "na": { + "child": { + "className": "Column", + "na": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Text", + "pa": [ + "You have pushed the button this many times:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "FairSugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "FairSugarProvider.anyToString", + "pa": [ + { + "className": "FairSugarProvider.valueReader", + "pa": [ + "^(value)", + "count" + ] + } + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "CounterModel" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "FairSugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "FairSugarProvider.stringValueReader", + "pa": [ + "^(value)", + "testName" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "CounterModel" + ] + }, + { + "className": "FairSelector", + "na": { + "builder": { + "className": "FairSugarProvider.selectorBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + "^(value)" + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + }, + "selector": { + "className": "FairSugarProvider.selector", + "pa": [ + { + "className": "FairSugarProvider.evaluationToString", + "pa": [ + "^(value)", + "someModel.a" + ], + "functionParameters": { + "pa": [ + "context", + "value" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "CounterModel", + "String" + ] + } + ] + } + } + } + }, + "floatingActionButton": { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "FairSugarProvider.widgetBuilder", + "pa": [ + { + "className": "FloatingActionButton", + "na": { + "onPressed": "@(_incrementCounter(^(context)))", + "tooltip": "Increment", + "child": { + "className": "Icon", + "pa": [ + "#(Icons.add)" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + } + } + }, + "typeArgumentList": [ + "CounterModel" + ] + } + }, + "typeArgumentList": [ + "LoginModel" + ] + } + }, + "typeArgumentList": [ + "CounterModel" + ], + "methodMap": {}, + "digest": "40c478199087adf8f05936a7f7bc34bd" +} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata new file mode 100644 index 00000000..a0216d16 --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata @@ -0,0 +1,7 @@ +# Generated by Fair on 2023-10-25 19:35:14.838560. + +source: example|lib/ui/counter_page_provider.dart +md5: fb818b363103f7c487d2f2aeb0162b60 +json: example|build/fair/lib_ui_counter_page_provider.fair.json +bin: example|build/fair/lib_ui_counter_page_provider.fair.bin +date: 2023-10-25 19:35:14.839444 diff --git a/fair_provider/example/ios/.gitignore b/fair_provider/example/ios/.gitignore new file mode 100644 index 00000000..7a7f9873 --- /dev/null +++ b/fair_provider/example/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/fair_provider/example/ios/Flutter/AppFrameworkInfo.plist b/fair_provider/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..9625e105 --- /dev/null +++ b/fair_provider/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 11.0 + + diff --git a/fair_provider/example/ios/Flutter/Debug.xcconfig b/fair_provider/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/fair_provider/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/fair_provider/example/ios/Flutter/Release.xcconfig b/fair_provider/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/fair_provider/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/fair_provider/example/ios/Podfile b/fair_provider/example/ios/Podfile new file mode 100644 index 00000000..88359b22 --- /dev/null +++ b/fair_provider/example/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/fair_provider/example/ios/Podfile.lock b/fair_provider/example/ios/Podfile.lock new file mode 100644 index 00000000..2e4fcf64 --- /dev/null +++ b/fair_provider/example/ios/Podfile.lock @@ -0,0 +1,28 @@ +PODS: + - fair (0.0.1): + - Flutter + - Flutter (1.0.0) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - fair (from `.symlinks/plugins/fair/ios`) + - Flutter (from `Flutter`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +EXTERNAL SOURCES: + fair: + :path: ".symlinks/plugins/fair/ios" + Flutter: + :path: Flutter + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + fair: a2ad8650ee4df9e6bcc51426213b3a3561dbacb8 + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86 + +PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 + +COCOAPODS: 1.12.0 diff --git a/fair_provider/example/ios/Runner.xcodeproj/project.pbxproj b/fair_provider/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..55cef8c7 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,553 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 94BA310586B5A9CF87F7AB4B /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCF153AF3994561FE278B895 /* Pods_Runner.framework */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 5E4BF71D2BE8D74A80DB18CB /* 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 = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B7C30DF2A1F0D0F3E92DF2FC /* 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 = ""; }; + BCF153AF3994561FE278B895 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D7802506E2F397A32E610450 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 94BA310586B5A9CF87F7AB4B /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 93140F6867E9C2D1F2FF6B74 /* Frameworks */ = { + isa = PBXGroup; + children = ( + BCF153AF3994561FE278B895 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + CA7905C5263AA99719E6F822 /* Pods */, + 93140F6867E9C2D1F2FF6B74 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; + CA7905C5263AA99719E6F822 /* Pods */ = { + isa = PBXGroup; + children = ( + D7802506E2F397A32E610450 /* Pods-Runner.debug.xcconfig */, + 5E4BF71D2BE8D74A80DB18CB /* Pods-Runner.release.xcconfig */, + B7C30DF2A1F0D0F3E92DF2FC /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + C79AF6FC94FD3E4CDF17A40A /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + D991A3FF2161D64F6EC88A29 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + C79AF6FC94FD3E4CDF17A40A /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + D991A3FF2161D64F6EC88A29 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = arm64; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.wuba.fair.fairprovider.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = arm64; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.wuba.fair.fairprovider.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + EXCLUDED_ARCHS = arm64; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.wuba.fair.fairprovider.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/fair_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/fair_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..c87d15a3 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fair_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/fair_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/fair_provider/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/fair_provider/example/ios/Runner/AppDelegate.swift b/fair_provider/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..70693e4a --- /dev/null +++ b/fair_provider/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/fair_provider/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/fair_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/fair_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/fair_provider/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fair_provider/example/ios/Runner/Base.lproj/Main.storyboard b/fair_provider/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/fair_provider/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fair_provider/example/ios/Runner/Info.plist b/fair_provider/example/ios/Runner/Info.plist new file mode 100644 index 00000000..7f553465 --- /dev/null +++ b/fair_provider/example/ios/Runner/Info.plist @@ -0,0 +1,51 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/fair_provider/example/ios/Runner/Runner-Bridging-Header.h b/fair_provider/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/fair_provider/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/fair_provider/example/lib/entity/counter_model.dart b/fair_provider/example/lib/entity/counter_model.dart new file mode 100644 index 00000000..d3fe5460 --- /dev/null +++ b/fair_provider/example/lib/entity/counter_model.dart @@ -0,0 +1,14 @@ +import 'package:fair_provider/fair_provider.dart'; + +class CounterModel extends FairChangeNotifier { + + var count = 0; + var testName = "dsds"; + SomeModel? someModel; + +} + +class SomeModel{ + var a = "a"; + +} \ No newline at end of file diff --git a/fair_provider/example/lib/entity/login_model.dart b/fair_provider/example/lib/entity/login_model.dart new file mode 100644 index 00000000..ce68490f --- /dev/null +++ b/fair_provider/example/lib/entity/login_model.dart @@ -0,0 +1,8 @@ +import 'package:fair_provider/fair_provider.dart'; + +class LoginModel extends FairChangeNotifier { + + String? account; + String? password; + +} \ No newline at end of file diff --git a/fair_provider/example/lib/main.dart b/fair_provider/example/lib/main.dart new file mode 100644 index 00000000..3a03dcac --- /dev/null +++ b/fair_provider/example/lib/main.dart @@ -0,0 +1,131 @@ +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + FairApp.runApplication( + FairApp( + generated: FairAppModule(), + child: const MyApp(), + dynamicWidgetBuilder: (proxyMirror, page, bound, {bundle}) => + ProviderDynamicWidgetBuilder(proxyMirror, page, bound, + bundle: bundle), + ), + plugins: {'FairProvider': FairProvider()}, + jsPlugins: {'fair_provider': 'packages/fair_provider/assets/plugin/fair_provider_plugin.js'} + ); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: + // MyHomePage(title: "dasdasdsa",), + Scaffold( + appBar: AppBar( + title: const Text('Flutter Lab'), + ), + body: Builder( + builder: (context) => ListView( + children: [ + addItem("CounterProvider Fair", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "CounterProvider", + path: + "assets/fair/lib_ui_counter_page_provider.fair.json", + ), + )); + }), + ], + ), + ))); + } +} + +Widget addItem(String itemName, dynamic onPress) { + return GestureDetector( + onTap: onPress, + child: Container( + alignment: Alignment.centerLeft, + height: 70, + decoration: BoxDecoration( + color: Colors.white, + border: Border( + bottom: BorderSide( + color: Colors.grey.withOpacity(0.5), width: 0.5))), + padding: const EdgeInsets.only(left: 20.0), + child: Text( + itemName, + style: const TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + textAlign: TextAlign.left, + ))); +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.title), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.headlineMedium, + ), + test(), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), + ); + } + + Widget test() { + return Container(); + } +} diff --git a/fair_provider/example/lib/ui/counter_page_provider.dart b/fair_provider/example/lib/ui/counter_page_provider.dart new file mode 100644 index 00000000..09d32bbb --- /dev/null +++ b/fair_provider/example/lib/ui/counter_page_provider.dart @@ -0,0 +1,114 @@ +import 'package:example/entity/counter_model.dart'; +import 'package:example/entity/login_model.dart'; +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +@FairPatch() +class CounterPageProvider extends StatefulWidget { + const CounterPageProvider({super.key}); + + @override + State createState() => _CounterPageProviderState(); +} + +class _CounterPageProviderState extends State { + var title = "我是写在js侧的title"; + + var counterModelJson = ''' +{ + "count":22, + "testName":"zzzzzz", + "someModel":{ + "a":"ffffff" + } +} + '''; + + var loginModelJson = ''' + { + "account":"qwerty12345", + "password":"zxcv54321" +} + '''; + + var counterModelJson2 = ''' +{ + "count":333, + "testName":"testName的初始值", + "someModel":{ + "a":"someModel中a的初始值" + } +} + '''; + + void onLoad() {} + + void onUnload() {} + + void _incrementCounter(FairContext context) { + var counterModel = context.read("CounterModel"); + counterModel.count++; + counterModel.testName = "及哦飞机佛IE我房间"; + counterModel.someModel?.a = "hahahaha"; + counterModel.notify(); + } + + @override + Widget build(BuildContext context) { + return FairChangeNotifierProvider( + initialJson: counterModelJson, + child: FairChangeNotifierProvider( + initialJson: loginModelJson, + child: FairChangeNotifierProvider( + initialJson: counterModelJson2, + child: Scaffold( + appBar: AppBar( + title: Text( + title, + ), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + FairConsumer( + builder: FairSugarProvider.consumerBuilder((context, value, + child) => + Text(FairSugarProvider.anyToString( + FairSugarProvider.valueReader(value, 'count')))), + ), + FairConsumer( + builder: FairSugarProvider.consumerBuilder( + (context, value, child) => Text( + FairSugarProvider.stringValueReader( + value, 'testName'))), + ), + FairSelector( + builder: FairSugarProvider.selectorBuilder( + (context, value, child) => Text(value)), + selector: FairSugarProvider.selector((context, value) => + FairSugarProvider.evaluationToString( + value, 'someModel.a'))), + ], + ), + ), + floatingActionButton: FairContextBuilder( + builder: FairSugarProvider.widgetBuilder( + (context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), + ), + ), + ), + ), + ); + } +} diff --git a/fair_provider/example/pubspec.lock b/fair_provider/example/pubspec.lock new file mode 100644 index 00000000..8a6f031c --- /dev/null +++ b/fair_provider/example/pubspec.lock @@ -0,0 +1,725 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + url: "https://pub.dev" + source: hosted + version: "61.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + url: "https://pub.dev" + source: hosted + version: "5.13.0" + archive: + dependency: transitive + description: + name: archive + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + url: "https://pub.dev" + source: hosted + version: "3.4.6" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" + source: hosted + version: "2.10.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "0713a05b0386bd97f9e63e78108805a4feca5898a4b821d6610857f10c91e975" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" + source: hosted + version: "2.3.3" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" + url: "https://pub.dev" + source: hosted + version: "7.2.7+1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: a8de5955205b4d1dbbbc267daddf2178bd737e4bab8987c04a500478c9651e74 + url: "https://pub.dev" + source: hosted + version: "8.6.3" + characters: + dependency: transitive + description: + name: characters + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" + source: hosted + version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.dev" + source: hosted + version: "4.7.0" + collection: + dependency: "direct overridden" + description: + name: collection + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" + source: hosted + version: "1.17.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + fair: + dependency: "direct main" + description: + path: "../../fair" + relative: true + source: path + version: "3.3.0" + fair_annotation: + dependency: transitive + description: + name: fair_annotation + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + fair_compiler: + dependency: "direct dev" + description: + path: "../../compiler" + relative: true + source: path + version: "1.8.0" + fair_dart2dsl: + dependency: "direct overridden" + description: + path: "../../dart2dsl" + relative: true + source: path + version: "1.4.0" + fair_dart2js: + dependency: transitive + description: + name: fair_dart2js + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + fair_provider: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "1.0.0+1" + fair_version: + dependency: "direct overridden" + description: + path: "../../flutter_version/flutter_3_7_0" + relative: true + source: path + version: "3.7.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.dev" + source: hosted + version: "2.0.5" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http: + dependency: transitive + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + lints: + dependency: transitive + description: + name: lints + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" + source: hosted + version: "0.12.13" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + meta: + dependency: transitive + description: + name: meta + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" + source: hosted + version: "1.8.2" + pedantic: + dependency: transitive + description: + name: pedantic + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + platform: + dependency: transitive + description: + name: platform + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.dev" + source: hosted + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + process: + dependency: transitive + description: + name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + provider: + dependency: transitive + description: + name: provider + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" + source: hosted + version: "6.0.5" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" + url: "https://pub.dev" + source: hosted + version: "1.3.2" + source_span: + dependency: transitive + description: + name: source_span + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" + source: hosted + version: "1.9.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" + source: hosted + version: "0.4.16" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + url: "https://pub.dev" + source: hosted + version: "6.1.11" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2 + url: "https://pub.dev" + source: hosted + version: "2.0.19" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=2.19.6 <3.0.0" + flutter: ">=3.7.0" diff --git a/fair_provider/example/pubspec.yaml b/fair_provider/example/pubspec.yaml new file mode 100644 index 00000000..7a510fe0 --- /dev/null +++ b/fair_provider/example/pubspec.yaml @@ -0,0 +1,39 @@ +name: example +description: A new Flutter project. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev +version: 1.0.0+1 + +environment: + sdk: '>=2.19.6 <3.0.0' + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + fair_provider: + path: ../../fair_provider + + fair: + path: ../../../fair/fair + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + build_runner: ^2.1.2 + fair_compiler: ^1.8.0 + +dependency_overrides: + collection: 1.17.0 + fair_version: + path: ../../../fair/flutter_version/flutter_3_7_0 + fair_compiler: + path: ../../../fair/compiler + fair_dart2dsl: + path: ../../../fair/dart2dsl + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/fair/ diff --git a/fair_provider/example/test/widget_test.dart b/fair_provider/example/test/widget_test.dart new file mode 100644 index 00000000..092d222f --- /dev/null +++ b/fair_provider/example/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:example/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/fair_provider/lib/fair_provider.dart b/fair_provider/lib/fair_provider.dart new file mode 100644 index 00000000..170c4220 --- /dev/null +++ b/fair_provider/lib/fair_provider.dart @@ -0,0 +1,4 @@ +export 'src/fair_app_module.dart'; +export 'src/fair_provider_core.dart'; +export 'src/fair_provider_plugin.dart'; +export 'src/provider_dynamic_widget_builder.dart'; \ No newline at end of file diff --git a/fair_provider/lib/src/fair_app_module.dart b/fair_provider/lib/src/fair_app_module.dart new file mode 100644 index 00000000..86ccc036 --- /dev/null +++ b/fair_provider/lib/src/fair_app_module.dart @@ -0,0 +1,46 @@ +import 'package:fair/fair.dart'; +import 'package:flutter/material.dart'; + +import 'fair_provider_core.dart'; + +class FairAppModule extends GeneratedModule { + @override + Map components() { + return { + 'InputBorder.none': InputBorder.none, + 'FairChangeNotifierProvider': (props) => FairChangeNotifierProvider( + key: props['key'], + child: props['child'], + initialJson: props['initialJson'], + )..setTypeArgumentList(props['ta']), + 'FairConsumer': (props) => FairConsumer( + key: props['key'], + builder: props['builder'], + child: props['child'], + )..setTypeArgumentList(props['ta']), + 'FairSelector': (props) => FairSelector( + key: props['key'], + builder: props['builder'], + selector: props['selector'], + child: props['child'], + )..setTypeArgumentList(props['ta']), + 'FairSugarProvider.valueReader': (props) => + FairSugarProvider.valueReader(props['pa'][0], props['pa'][1]), + 'FairSugarProvider.stringValueReader': (props) => + FairSugarProvider.stringValueReader(props['pa'][0], props['pa'][1]), + 'FairSugarProvider.evaluationToString': (props) => + FairSugarProvider.evaluationToString(props['pa'][0], props['pa'][1]), + 'FairSugarProvider.anyToString': (props) => + FairSugarProvider.anyToString(props['pa'][0]), + 'FairContextBuilder': (props) => FairContextBuilder( + key: props['key'], + builder: props['builder'], + ), + }; + } + + @override + Map mapping() { + return {}; + } +} diff --git a/fair_provider/lib/src/fair_provider_core.dart b/fair_provider/lib/src/fair_provider_core.dart new file mode 100644 index 00000000..9448dce0 --- /dev/null +++ b/fair_provider/lib/src/fair_provider_core.dart @@ -0,0 +1,468 @@ +import 'dart:convert'; + +import 'package:fair/fair.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:provider/single_child_widget.dart'; +import 'package:collection/collection.dart'; + +import 'utils/time_record.dart'; + +final Map _fairModelPool = {}; + +class FairProviderPlugin { + static T find(String className) { + return _fairModelPool[className] as T; + } + + static printObject(dynamic obj) {} +} + +class FairChangeNotifier extends ChangeNotifier { + FairChangeNotifier(); + + String? fairRuntimeTypeKey; + final Runtime _runtime = Runtime(); + + dynamic operator [](String key) { + final record = TimeRecord("FairChangeNotifier取值")..start(); + final jsResult = _runtime + .invokeMethodSync("FairProviderPlugin", "find", [fairRuntimeTypeKey]); + record.done(); + final jsResultObj = jsonDecode(jsResult); + final jsModel = jsResultObj["result"]["result"]; + return jsModel[key]; + } + + dynamic evaluation(String expression) { + final record = TimeRecord("FairChangeNotifier执行表达式")..start(); + final jsResult = _runtime.invokeMethodSync( + "FairProviderPlugin", "evaluation", [fairRuntimeTypeKey, expression]); + record.done(); + final jsResultObj = jsonDecode(jsResult); + final jsModel = jsResultObj["result"]["result"]; + return jsModel; + } + + void notify() { + notifyListeners(); + } + + void print() { + //impl in js plugin + } +} + +class FairContext { + String id = "FairContext"; + List treeModelKeyRecords = []; + + FairContext(this.treeModelKeyRecords); + + Map toJson() { + Map map = {}; + map["id"] = id; + map["treeModelKeyRecords"] = treeModelKeyRecords; + return map; + } + + T read(String className) { + return _fairModelPool[className] as T; + } +} + +typedef FairContextWidgetBuilder = Widget Function(FairContext context); +typedef FairContextWidgetBuilder2 = Widget Function(String context); + +class FairContextBuilder extends StatelessWidget { + /// Creates a widget that delegates its build to a callback. + /// + /// The [builder] argument must not be null. + const FairContextBuilder({ + super.key, + required this.builder, + }) : assert(builder != null); + + /// Called to obtain the child widget. + /// + /// This function is called whenever this widget is included in its parent's + /// build and the old widget (if any) that it synchronizes with has a distinct + /// object identity. Typically the parent's build method will construct + /// a new tree of widgets and so a new Builder child will not be [identical] + /// to the corresponding old one. + final FairContextWidgetBuilder builder; + + @override + Widget build(BuildContext context) { + //构建FairContext将整颗树的信息录入 + final fairContext = FairContext( + (context as FairContextBuilderElement).getTreeModelKeyRecords()); + return builder(fairContext); + } + + @override + StatelessElement createElement() { + return FairContextBuilderElement(this); + } +} + +class FairContextBuilderElement extends StatelessElement { + FairContextBuilderElement(FairContextBuilder widget) : super(widget); + + FairContextBuilder get widget => super.widget as FairContextBuilder; + + List getTreeModelKeyRecords() { + List treeModelKeyRecords = []; + visitAncestorElements((parent) { + if (parent.runtimeType.toString() == + '_InheritedProviderScopeElement') { + final grandParent = _findGrandParent(parent); + if (grandParent != null && + grandParent is FairChangeNotifierProviderElement) { + treeModelKeyRecords.add(grandParent.widget.modelKey); + } + } + return true; + }); + return treeModelKeyRecords; + } + + Element? _findGrandParent(Element child) { + int count = 0; + Element? grandParent; + child.visitAncestorElements((parent) { + if (++count == 2) { + grandParent = parent; + return false; + } + return true; + }); + return grandParent; + } +} + +typedef FairConsumerBuilder = Widget Function( + BuildContext context, + dynamic value, + Widget? child, + ); + +typedef FairSelectorSelector = dynamic Function( + BuildContext context, + dynamic value, + ); + +class FairSugarProvider { + FairSugarProvider._(); + + /// Provider消费者Builder,用于Consumer + static FairConsumerBuilder consumerBuilder(FairConsumerBuilder builder) => + builder; + + /// Provider消费者Builder,用于Selector + static FairConsumerBuilder selectorBuilder(FairConsumerBuilder builder) => + builder; + + /// 用于Selector中指定监听字段的selector + static FairSelectorSelector selector(FairSelectorSelector selector) => + selector; + + ///用于从 + static dynamic valueReader( + FairChangeNotifier model, + String key, + ) => + model[key] ?? 'null'; + + static String stringValueReader( + FairChangeNotifier model, + String key, + ) => + (model[key] ?? 'null').toString(); + + static dynamic anyToString(dynamic value) { + return value.toString(); + } + + static String evaluationToString( + FairChangeNotifier model, + String expression, + ) => + (model.evaluation(expression) ?? 'null').toString(); + + static FairContextWidgetBuilder widgetBuilder( + FairContextWidgetBuilder builder) => + builder; + + static FairContextWidgetBuilder2 widgetBuilder2( + FairContextWidgetBuilder2 builder) => + builder; +} + +class FairChangeNotifierProvider + extends StatefulWidget +{ + FairChangeNotifierProvider({Key? key, required this.child, this.initialJson}) + : super(key: key); + + Widget child; + + String? initialJson; + + late String modelKey; + + final Runtime _runtime = Runtime(); + + String? fairRuntimeTypeKey; + + List? typeArgumentList; + + void setTypeArgumentList(List typeArgumentList) { + this.typeArgumentList = typeArgumentList; + fairRuntimeTypeKey = typeArgumentList[0]; + } + + @override + State createState() => + FairChangeNotifierProviderState(); + + @override + StatefulElement createElement() { + return FairChangeNotifierProviderElement(this); + } +} + +class FairChangeNotifierProviderElement extends StatefulElement { + FairChangeNotifierProviderElement(this.widget) : super(widget); + FairChangeNotifierProvider widget; +} + +class FairChangeNotifierProviderState + extends State { + static int _counter = 0; + + late FairChangeNotifier fairModel; + + @override + void initState() { + super.initState(); + _createModelInJs(); + } + + /// 通知js侧创建model,然后counter++ + void _createModelInJs() { + final record = TimeRecord("FairChangeNotifierProvider创建jsModel")..start(); + widget.modelKey = "${widget.fairRuntimeTypeKey}_${_counter++}"; + final jsResult = widget._runtime.invokeMethodSync( + "FairProviderPlugin", "create", [widget.modelKey, widget.initialJson]); + record.done(); + final jsResultObj = jsonDecode(jsResult); + final jsModel = jsResultObj["result"]["result"]; + fairModel = _fairModelPool[widget.modelKey] = FairChangeNotifier() + ..fairRuntimeTypeKey = widget.modelKey; + } + + @override + void dispose() { + super.dispose(); + _fairModelPool.remove(widget.modelKey); + } + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (context) => fairModel, + lazy: false, + child: widget.child, + ); + } +} + +class FairConsumer + extends SingleChildStatelessWidget // with GenericsReceiver +{ + FairConsumer({Key? key, required this.builder, Widget? child}) + : super(key: key, child: child); + + String? fairRuntimeTypeKey; + + late String modelKey; + + FairChangeNotifier get fairModel { + return _fairModelPool[modelKey] as FairChangeNotifier; + } + + List? typeArgumentList; + + void setTypeArgumentList(List typeArgumentList) { + this.typeArgumentList = typeArgumentList; + fairRuntimeTypeKey = typeArgumentList[0]; + } + + final Widget Function( + BuildContext context, + FairChangeNotifier value, + Widget? child, + ) builder; + + @override + Widget buildWithChild(BuildContext context, Widget? child) { + //绑定观察者 updateDependents + (context as FairConsumerElement).bindDependents(); + return builder( + context, + fairModel, + child, + ); + } + + @override + SingleChildStatelessElement createElement() { + return FairConsumerElement(this); + } +} + +class FairConsumerElement extends SingleChildStatelessElement { + FairConsumerElement(FairConsumer widget) : super(widget); + + FairConsumer get widget => super.widget as FairConsumer; + + void bindDependents() { + visitAncestorElements((parent) { + if (parent.runtimeType.toString() == + '_InheritedProviderScopeElement') { + final grandParent = _findGrandParent(parent); + if (grandParent != null && + grandParent is FairChangeNotifierProviderElement && + grandParent.widget.fairRuntimeTypeKey == + widget.fairRuntimeTypeKey) { + widget.modelKey = grandParent.widget.modelKey; + dependOnInheritedElement(parent as InheritedElement); + return false; + } + } + return true; + }); + } + + Element? _findGrandParent(Element child) { + int count = 0; + Element? grandParent; + child.visitAncestorElements((parent) { + if (++count == 2) { + grandParent = parent; + return false; + } + return true; + }); + return grandParent; + } +} + +class FairSelector + extends SingleChildStatefulWidget { + FairSelector({ + Key? key, + required this.builder, + required this.selector, + ShouldRebuild? shouldRebuild, + Widget? child, + }) : _shouldRebuild = shouldRebuild, + super(key: key, child: child); + + String? fairRuntimeTypeKey; + + late String modelKey; + + FairChangeNotifier get fairModel { + return _fairModelPool[modelKey] as FairChangeNotifier; + } + + List? typeArgumentList; + + void setTypeArgumentList(List typeArgumentList) { + this.typeArgumentList = typeArgumentList; + fairRuntimeTypeKey = typeArgumentList[0]; + } + + final ValueWidgetBuilder builder; + + final FairSelectorSelector selector; + + final ShouldRebuild? _shouldRebuild; + + @override + _FairSelectorState createState() => _FairSelectorState(); + + @override + SingleChildStatefulElement createElement() { + return FairSelectorElement(this); + } +} + +class _FairSelectorState + extends SingleChildState> { + T? value; + Widget? cache; + Widget? oldWidget; + + @override + Widget buildWithChild(BuildContext context, Widget? child) { + (context as FairSelectorElement).bindDependents(); + final selected = widget.selector(context, widget.fairModel); + + final shouldInvalidateCache = oldWidget != widget || + (widget._shouldRebuild != null && + widget._shouldRebuild!(value as T, selected)) || + (widget._shouldRebuild == null && + !const DeepCollectionEquality().equals(value, selected)); + if (shouldInvalidateCache) { + value = selected; + oldWidget = widget; + cache = widget.builder( + context, + selected, + child, + ); + } + return cache!; + } +} + +class FairSelectorElement extends SingleChildStatefulElement { + FairSelectorElement(FairSelector widget) : super(widget); + + FairSelector get widget => super.widget as FairSelector; + + void bindDependents() { + visitAncestorElements((parent) { + if (parent.runtimeType.toString() == + '_InheritedProviderScopeElement') { + final grandParent = _findGrandParent(parent); + //如果grandParent是FairChangeNotifierProviderElement + if (grandParent != null && + grandParent is FairChangeNotifierProviderElement && + grandParent.widget.fairRuntimeTypeKey == + widget.fairRuntimeTypeKey) { + widget.modelKey = grandParent.widget.modelKey; + dependOnInheritedElement(parent as InheritedElement); + return false; + } + } + return true; + }); + } + + Element? _findGrandParent(Element child) { + int count = 0; + Element? grandParent; + child.visitAncestorElements((parent) { + if (++count == 2) { + grandParent = parent; + return false; + } + return true; + }); + return grandParent; + } +} diff --git a/fair_provider/lib/src/fair_provider_plugin.dart b/fair_provider/lib/src/fair_provider_plugin.dart new file mode 100644 index 00000000..e003836a --- /dev/null +++ b/fair_provider/lib/src/fair_provider_plugin.dart @@ -0,0 +1,44 @@ +import 'dart:convert'; + +import 'package:fair/fair.dart'; + +import 'fair_provider_core.dart'; + +class FairProvider extends IFairPlugin { + static final FairProvider _fairProvider = FairProvider._internal(); + + FairProvider._internal(); + + factory FairProvider() { + return _fairProvider; + } + + static void notifyListeners({ + required String fairRuntimeTypeKey, + }) { + FairProviderPlugin.find(fairRuntimeTypeKey).notify(); + } + + static void _notifyListeners(dynamic map) async { + if (map == null) { + return; + } + var req; + if (map is Map) { + req = map; + } else { + req = jsonDecode(map); + } + var args = req['args']; + var jsonMap = jsonDecode(args['jsonMap']); + var fairRuntimeTypeKey = jsonMap['fairRuntimeTypeKey']; + notifyListeners(fairRuntimeTypeKey: fairRuntimeTypeKey); + } + + @override + Map getRegisterMethods() { + var functions = {}; + functions.putIfAbsent('notifyListeners', () => _notifyListeners); + return functions; + } +} diff --git a/fair_provider/lib/src/provider_dynamic_widget_builder.dart b/fair_provider/lib/src/provider_dynamic_widget_builder.dart new file mode 100644 index 00000000..a9be0e16 --- /dev/null +++ b/fair_provider/lib/src/provider_dynamic_widget_builder.dart @@ -0,0 +1,145 @@ +import 'package:fair/src/render/builder.dart'; +import 'package:fair/src/render/proxy.dart'; +import 'package:fair/src/render/domain.dart'; +import 'package:fair/src/internal/bind_data.dart'; +import 'package:fair/src/type.dart'; +import 'package:flutter/material.dart'; + +import 'fair_provider_core.dart'; + +class ProviderDynamicWidgetBuilder extends DynamicWidgetBuilder { + ProviderDynamicWidgetBuilder( + ProxyMirror? proxyMirror, String? page, BindingData? bound, + {String? bundle}) + : super(proxyMirror, page, bound, bundle: bundle); + + @override + dynamic convert(BuildContext context, Map map, Map? methodMap, + {Domain? domain}) { + var name = map[tag]; + if (name == 'FairSugarProvider.consumerBuilder' || + name == 'FairSugarProvider.selectorBuilder') { + return _buildFairSugarConsumerBuilder( + context, + map, + methodMap, + domain: domain, + ); + } else if (name == 'FairSugarProvider.selector') { + return _buildFairSugarSelector( + context, + map, + methodMap, + domain: domain, + ); + } else if (name == 'FairSugarProvider.widgetBuilder') { + return _buildFairSugarWidgetBuilder( + context, + map, + methodMap, + domain: domain, + ); + } else if (name == 'FairSugarProvider.widgetBuilder2') { + return _buildFairSugarWidgetBuilder2( + context, + map, + methodMap, + domain: domain, + ); + } + return super.convert( + context, + map, + methodMap, + domain: domain, + ); + } + + dynamic _buildFairSugarConsumerBuilder( + BuildContext context, Map map, Map? methodMap, + {Domain? domain}) { + dynamic source = pa0(map); + assert(source is Map); + List functionParameters = FunctionDomain.pa(source); + FairConsumerBuilder builder = (builderContext, value, child) { + return convert( + context, + source, + methodMap, + domain: FunctionDomain( + { + functionParameters[0]: builderContext, + functionParameters[1]: value, + functionParameters[2]: child, + }, + parent: domain, + ), + ); + }; + return builder; + } + + dynamic _buildFairSugarSelector(BuildContext context, Map map, Map? methodMap, + {Domain? domain}) { + dynamic source = pa0(map); + assert(source is Map); + List functionParameters = FunctionDomain.pa(source); + FairSelectorSelector selector = (builderContext, value) { + return convert( + context, + source, + methodMap, + domain: FunctionDomain( + { + functionParameters[0]: builderContext, + functionParameters[1]: value, + }, + parent: domain, + ), + ); + }; + return selector; + } + + dynamic _buildFairSugarWidgetBuilder(BuildContext context, Map map, Map? methodMap, + {Domain? domain}) { + dynamic source = pa0(map); + assert(source is Map); + List functionParameters = FunctionDomain.pa(source); + FairContextWidgetBuilder builder = (builderContext) { + return convert( + context, + source, + methodMap, + domain: FunctionDomain( + { + functionParameters[0]: builderContext, + }, + parent: domain, + ), + ); + }; + return builder; + } + + dynamic _buildFairSugarWidgetBuilder2(BuildContext context, Map map, Map? methodMap, + {Domain? domain}) { + dynamic source = pa0(map); + assert(source is Map); + List functionParameters = FunctionDomain.pa(source); + FairContextWidgetBuilder2 builder = (builderContext) { + return convert( + context, + source, + methodMap, + domain: FunctionDomain( + { + functionParameters[0]: builderContext, + }, + parent: domain, + ), + ); + }; + return builder; + } +} diff --git a/fair_provider/lib/src/utils/time_record.dart b/fair_provider/lib/src/utils/time_record.dart new file mode 100644 index 00000000..060ee5ff --- /dev/null +++ b/fair_provider/lib/src/utils/time_record.dart @@ -0,0 +1,21 @@ +class TimeRecord { + + TimeRecord(this.tag); + + String? tag; + + late DateTime _startTime; + late DateTime _endTime; + + void start() { + _startTime = DateTime.now(); + } + + void done() { + _endTime = DateTime.now(); + final duration = _endTime.difference(_startTime); + final milliseconds = duration.inMilliseconds; + print('耗时统计 Time elapsed: $milliseconds milliseconds'); + } + +} \ No newline at end of file diff --git a/fair_provider/pubspec.lock b/fair_provider/pubspec.lock new file mode 100644 index 00000000..889b5f76 --- /dev/null +++ b/fair_provider/pubspec.lock @@ -0,0 +1,717 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + url: "https://pub.dev" + source: hosted + version: "61.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + url: "https://pub.dev" + source: hosted + version: "5.13.0" + archive: + dependency: transitive + description: + name: archive + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + url: "https://pub.dev" + source: hosted + version: "3.4.6" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" + source: hosted + version: "2.10.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + url: "https://pub.dev" + source: hosted + version: "2.3.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "0713a05b0386bd97f9e63e78108805a4feca5898a4b821d6610857f10c91e975" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + url: "https://pub.dev" + source: hosted + version: "2.3.3" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: "0671ad4162ed510b70d0eb4ad6354c249f8429cab4ae7a4cec86bbc2886eb76e" + url: "https://pub.dev" + source: hosted + version: "7.2.7+1" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: a8de5955205b4d1dbbbc267daddf2178bd737e4bab8987c04a500478c9651e74 + url: "https://pub.dev" + source: hosted + version: "8.6.3" + characters: + dependency: transitive + description: + name: characters + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" + source: hosted + version: "1.2.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.dev" + source: hosted + version: "4.7.0" + collection: + dependency: "direct overridden" + description: + name: collection + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" + source: hosted + version: "1.17.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + fair: + dependency: "direct main" + description: + path: "../../fair/fair" + relative: true + source: path + version: "3.3.0" + fair_annotation: + dependency: transitive + description: + name: fair_annotation + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + fair_compiler: + dependency: "direct dev" + description: + path: "../../fair/compiler" + relative: true + source: path + version: "1.8.0" + fair_dart2dsl: + dependency: "direct overridden" + description: + path: "../../fair/dart2dsl" + relative: true + source: path + version: "1.4.0" + fair_dart2js: + dependency: "direct overridden" + description: + path: "../../fair/dart2js" + relative: true + source: path + version: "1.4.0" + fair_version: + dependency: "direct overridden" + description: + path: "../../fair/flutter_version/flutter_3_7_0" + relative: true + source: path + version: "3.7.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + file: + dependency: transitive + description: + name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" + source: hosted + version: "6.1.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flat_buffers: + dependency: transitive + description: + name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.dev" + source: hosted + version: "2.0.5" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.dev" + source: hosted + version: "2.0.3" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + http: + dependency: transitive + description: + name: http + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.dev" + source: hosted + version: "0.13.6" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + intl: + dependency: transitive + description: + name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" + source: hosted + version: "0.17.0" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" + source: hosted + version: "0.6.5" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + lints: + dependency: transitive + description: + name: lints + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" + source: hosted + version: "0.12.13" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + meta: + dependency: transitive + description: + name: meta + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" + source: hosted + version: "1.8.2" + pedantic: + dependency: transitive + description: + name: pedantic + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + platform: + dependency: transitive + description: + name: platform + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.dev" + source: hosted + version: "3.1.3" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.dev" + source: hosted + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.dev" + source: hosted + version: "3.7.3" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + process: + dependency: transitive + description: + name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" + source: hosted + version: "4.2.4" + provider: + dependency: "direct main" + description: + name: provider + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" + source: hosted + version: "6.0.5" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" + url: "https://pub.dev" + source: hosted + version: "1.3.2" + source_span: + dependency: transitive + description: + name: source_span + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" + source: hosted + version: "1.9.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" + source: hosted + version: "0.4.16" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + url_launcher: + dependency: transitive + description: + name: url_launcher + sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + url: "https://pub.dev" + source: hosted + version: "6.1.11" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2 + url: "https://pub.dev" + source: hosted + version: "2.0.19" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.dev" + source: hosted + version: "3.1.0" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=2.19.6 <3.0.0" + flutter: ">=3.7.0" diff --git a/fair_provider/pubspec.yaml b/fair_provider/pubspec.yaml new file mode 100644 index 00000000..dee023a7 --- /dev/null +++ b/fair_provider/pubspec.yaml @@ -0,0 +1,40 @@ +name: fair_provider +description: An extension library for Fair on the Provider framework. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev +version: 1.0.0+1 + +environment: + sdk: '>=2.19.6 <3.0.0' + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.2 + # fair: 3.3.0 + fair: + path: ../../fair/fair + provider: ^6.0.5 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^2.0.0 + build_runner: ^2.1.2 + fair_compiler: ^1.8.0 + +dependency_overrides: + collection: 1.17.0 + fair_version: + path: ../../fair/flutter_version/flutter_3_7_0 + fair_dart2dsl: + path: ../../fair/dart2dsl + fair_dart2js: + path: ../../fair/dart2js + fair_compiler: + path: ../../fair/compiler + +flutter: + uses-material-design: true + assets: + - assets/ + - assets/plugin/ \ No newline at end of file From 599dfe270c0c6da59d2b6090d7674696a654e1fc Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 27 Oct 2023 12:17:32 +0800 Subject: [PATCH 08/44] change qr code --- resources/wechat-group-02.png | Bin 23485 -> 23753 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index c29dd7d6db0aa13643cc5a281032630b12d0f0c5..b0ea936e5ae24c7dfacd20ca2c6d3bebb3d1856e 100644 GIT binary patch literal 23753 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 literal 23485 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 Date: Wed, 1 Nov 2023 14:49:08 +0800 Subject: [PATCH 09/44] [feature] Support Flutter 3.13.x & update example --- example/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 3 +- example/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- ...t_flutter_ui_component_home_list.fair.json | 3 +- ...utter_ui_component_home_list.fair.metadata | 6 +- ...component_hotel_listview_content.fair.json | 3 +- ...onent_hotel_listview_content.fair.metadata | 6 +- ..._best_flutter_ui_feedback_screen.fair.json | 3 +- ...t_flutter_ui_feedback_screen.fair.metadata | 6 +- .../lib_best_flutter_ui_help_screen.fair.json | 3 +- ..._best_flutter_ui_help_screen.fair.metadata | 6 +- ..._flutter_ui_invite_friend_screen.fair.json | 3 +- ...tter_ui_invite_friend_screen.fair.metadata | 6 +- ...fair_widget_fair_delegate_widget.fair.json | 3 +- ..._widget_fair_delegate_widget.fair.metadata | 6 +- ...b_fair_widget_fair_plugin_widget.fair.json | 3 +- ...ir_widget_fair_plugin_widget.fair.metadata | 6 +- ...ib_fair_widget_fair_props_widget.fair.json | 3 +- ...air_widget_fair_props_widget.fair.metadata | 6 +- ..._fairbinding_fair_binding_sample.fair.json | 3 +- ...rbinding_fair_binding_sample.fair.metadata | 6 +- .../fair/lib_json_file_explain.fair.json | 3 +- .../fair/lib_json_file_explain.fair.metadata | 6 +- example/assets/fair/lib_main.fair.json | 3 +- example/assets/fair/lib_main.fair.metadata | 6 +- .../fair/lib_page2page_page_one.fair.json | 3 +- .../fair/lib_page2page_page_one.fair.metadata | 6 +- .../fair/lib_page2page_page_two.fair.json | 3 +- .../fair/lib_page2page_page_two.fair.metadata | 6 +- ..._template_appbar_appbar_template.fair.json | 3 +- ...plate_appbar_appbar_template.fair.metadata | 6 +- ...template_detail_page_fair_detail.fair.json | 3 +- ...late_detail_page_fair_detail.fair.metadata | 6 +- ..._template_drawer_drawer_template.fair.json | 3 +- ...plate_drawer_drawer_template.fair.metadata | 6 +- .../lib_template_fab_fab_template.fair.json | 3 +- ...ib_template_fab_fab_template.fair.metadata | 6 +- ...plate_gridview_gridview_template.fair.json | 3 +- ...e_gridview_gridview_template.fair.metadata | 6 +- ...listview_hotel_listview_template.fair.json | 3 +- ...view_hotel_listview_template.fair.metadata | 6 +- ..._template_list_card_moments_list.fair.json | 3 +- ...plate_list_card_moments_list.fair.metadata | 6 +- ...lib_template_list_page_list_page.fair.json | 3 +- ...template_list_page_list_page.fair.metadata | 6 +- ...e_login_page_login_page_template.fair.json | 3 +- ...gin_page_login_page_template.fair.metadata | 6 +- ...plate_pageview_pageview_template.fair.json | 3 +- ...e_pageview_pageview_template.fair.metadata | 6 +- ...plate_scrollview_home_scrollview.fair.json | 3 +- ...e_scrollview_home_scrollview.fair.metadata | 6 +- ...ggered_view_staggeredview_template.fair.js | 2 +- ...ered_view_staggeredview_template.fair.json | 3 +- ..._view_staggeredview_template.fair.metadata | 6 +- ...template_tabbar_page_tabbar_page.fair.json | 3 +- ...late_tabbar_page_tabbar_page.fair.metadata | 6 +- example/build_runner.sh | 11 + example/lib/best_flutter_ui/app_theme.dart | 2 +- .../component/composer_widget.dart | 3 +- .../best_flutter_ui/component/home_list.dart | 4 +- .../component/hotel_listview_content.dart | 1 - example/lib/best_flutter_ui/fair_state.dart | 1 - .../lib/best_flutter_ui/feedback_screen.dart | 2 +- .../fitness_app/ui_view/area_list_view.dart | 2 +- .../fitness_app/ui_view/glass_view.dart | 3 +- .../ui_view/mediterranesn_diet_view.dart | 3 +- .../fitness_app/ui_view/running_view.dart | 2 +- .../fitness_app/ui_view/workout_view.dart | 2 +- .../hotel_booking/calendar_popup_view.dart | 2 - .../hotel_booking/hotel_app_theme.dart | 3 - .../hotel_booking/hotel_home_screen.dart | 2 - .../hotel_booking/slider_view.dart | 1 - example/lib/src/generated.fair.dart | 5 +- .../staggeredview_template.dart | 8 +- example/pubspec.yaml | 5 +- fair/lib/src/render/expression.dart | 14 +- fair/lib/src/render/property.dart | 7 +- flutter_version/flutter_3_13_0/CHANGELOG.md | 40 + flutter_version/flutter_3_13_0/LICENSE | 25 + flutter_version/flutter_3_13_0/README.md | 80 + .../flutter_3_13_0/analysis_options.yaml | 13 + flutter_version/flutter_3_13_0/autoImport | 20 + .../flutter_3_13_0/lib/fair_version.dart | 11 + .../flutter_3_13_0/lib/src/fair_utf8.dart | 14 + .../flutter_3_13_0/lib/src/part/c.part.dart | 21 + .../flutter_3_13_0/lib/src/part/w.part.dart | 9 + .../flutter_3_13_0/lib/src/widgets/$$a.dart | 143 + .../flutter_3_13_0/lib/src/widgets/$$c.dart | 2094 ++++ .../flutter_3_13_0/lib/src/widgets/$$m.dart | 10278 ++++++++++++++++ .../flutter_3_13_0/lib/src/widgets/$$p.dart | 512 + .../flutter_3_13_0/lib/src/widgets/$$r.dart | 153 + .../flutter_3_13_0/lib/src/widgets/$$w.dart | 4041 ++++++ .../flutter_3_13_0/lib/src/widgets/all.dart | 19 + .../lib/src/widgets/module.dart | 11 + .../flutter_3_13_0/lib/src/widgets/utils.dart | 16 + .../lib/src/widgets/version.dart | 581 + flutter_version/flutter_3_13_0/pubspec.yaml | 55 + test_case/adobe_xd/android/app/build.gradle | 8 +- .../android/app/src/main/AndroidManifest.xml | 3 +- test_case/adobe_xd/android/build.gradle | 26 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../adobe_xd/assets/bundle/lib_Gear.fair.bin | Bin 4032 -> 0 bytes .../adobe_xd/assets/bundle/lib_Gear.fair.js | 1 + .../adobe_xd/assets/bundle/lib_Gear.fair.json | 13 +- .../adobe_xd/assets/bundle/lib_Home.fair.bin | Bin 8696 -> 0 bytes .../adobe_xd/assets/bundle/lib_Home.fair.js | 1 + .../adobe_xd/assets/bundle/lib_Home.fair.json | 18 +- test_case/adobe_xd/build_runner.sh | 11 + test_case/adobe_xd/lib/Gear.dart | 21 +- test_case/adobe_xd/lib/GearItem.dart | 2 +- test_case/adobe_xd/lib/Home.dart | 37 +- test_case/adobe_xd/lib/ItemWidget.dart | 17 +- test_case/adobe_xd/lib/module.dart | 6 +- .../adobe_xd/lib/src/generated.fair.dart | 146 +- test_case/adobe_xd/pubspec.lock | 429 +- test_case/adobe_xd/pubspec.yaml | 6 +- .../android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../animated_text_kit/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../animated_text_kit/lib/home_page.dart | 2 +- .../lib/src/generated.fair.dart | 35 +- test_case/animated_text_kit/lib/theme.dart | 2 +- test_case/animated_text_kit/pubspec.yaml | 10 +- .../android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../bundle/lib_component_home_list.fair.js | 1 + .../bundle/lib_component_home_list.fair.json | 3 +- .../lib_component_home_list.fair.metadata | 7 +- ...b_component_hotel_listview_content.fair.js | 2 +- ...component_hotel_listview_content.fair.json | 57 +- ...r_component_grid_gridview_template.fair.js | 2 +- ...component_grid_gridview_template.fair.json | 8 +- ...onent_grid_gridview_template.fair.metadata | 7 - ...mponent_meals_list_meals_list_view.fair.js | 1 + ...onent_meals_list_meals_list_view.fair.json | 3 +- ...omponent_my_diary_body_measurement.fair.js | 1 + ...ponent_my_diary_body_measurement.fair.json | 3 +- ...fair_component_my_diary_glass_view.fair.js | 1 + ...ir_component_my_diary_glass_view.fair.json | 3 +- ...ponent_my_diary_mediterranean_diet.fair.js | 1 + ...nent_my_diary_mediterranean_diet.fair.json | 3 +- .../lib_fair_component_my_diary_water.fair.js | 1 + ...ib_fair_component_my_diary_water.fair.json | 3 +- ..._component_trainning_area_of_focus.fair.js | 1 + ...omponent_trainning_area_of_focus.fair.json | 3 +- ...b_fair_component_trainning_running.fair.js | 1 + ...fair_component_trainning_running.fair.json | 3 +- ...r_component_trainning_your_program.fair.js | 1 + ...component_trainning_your_program.fair.json | 3 +- .../lib_fair_page_my_diary_page.fair.js | 1 + .../lib_fair_page_my_diary_page.fair.json | 3 +- .../lib_fair_page_training_page.fair.js | 1 + .../lib_fair_page_training_page.fair.json | 3 +- .../assets/bundle/lib_feedback_screen.fair.js | 1 + .../bundle/lib_feedback_screen.fair.json | 3 +- .../assets/bundle/lib_help_screen.fair.js | 1 + .../assets/bundle/lib_help_screen.fair.json | 3 +- .../bundle/lib_invite_friend_screen.fair.js | 1 + .../bundle/lib_invite_friend_screen.fair.json | 3 +- .../best_flutter_ui_templates/build_runner.sh | 11 + .../lib/best_ui_page.dart | 50 + .../lib/component/composer_widget.dart | 4 +- .../lib/component/home_list.dart | 13 +- .../lib/component/hotel_listview_content.dart | 61 +- .../custom_drawer/drawer_user_controller.dart | 97 +- .../lib/custom_drawer/home_drawer.dart | 65 +- .../lib/design_course/category_list_view.dart | 22 +- .../lib/design_course/course_info_screen.dart | 83 +- .../lib/design_course/home_design_course.dart | 4 +- .../popular_course_list_view.dart | 103 +- .../component/grid/gridview_template.dart | 6 +- .../component/meals_list/meals_list_view.dart | 5 +- .../fair/component/meals_list/meals_view.dart | 4 +- .../component/my_diary/bottom_bar_view.dart | 2 +- .../fair/component/my_diary/glass_view.dart | 4 +- .../my_diary/mediterranean_diet.dart | 2 - .../lib/fair/component/my_diary/water.dart | 4 +- .../fair/component/my_diary/wave_view.dart | 2 - .../lib/fair/component/trainning/running.dart | 3 +- .../component/trainning/your_program.dart | 4 +- .../lib/fair/page/my_diary_page.dart | 4 +- .../lib/fair/page/training_page.dart | 4 +- .../lib/feedback_screen.dart | 1 - .../bottom_bar_view.dart | 51 +- .../lib/fitness_app/fintness_app_theme.dart | 89 - .../fitness_app/fitness_app_home_screen.dart | 38 +- .../lib/fitness_app/models/tabIcon_data.dart | 2 - .../fitness_app/my_diary/meals_list_view.dart | 26 +- .../fitness_app/my_diary/my_diary_screen.dart | 30 +- .../lib/fitness_app/my_diary/water_view.dart | 4 +- .../fitness_app/training/training_screen.dart | 3 +- .../fitness_app/traning/training_screen.dart | 295 + .../fitness_app/ui_view/area_list_view.dart | 5 +- .../lib/fitness_app/ui_view/glass_view.dart | 5 +- .../ui_view/mediterranean_diet_view.dart | 2 +- .../ui_view/mediterranesn_diet_view.dart | 96 +- .../lib/fitness_app/ui_view/running_view.dart | 2 +- .../lib/fitness_app/ui_view/title_view.dart | 4 +- .../lib/fitness_app/ui_view/wave_view.dart | 40 +- .../lib/fitness_app/ui_view/workout_view.dart | 8 +- .../lib/hex_color.dart | 13 + .../lib/home_screen.dart | 121 +- .../hotel_booking/calendar_popup_view.dart | 46 +- .../lib/hotel_booking/custom_calendar.dart | 66 +- .../lib/hotel_booking/hotel_app_theme.dart | 2 +- .../lib/hotel_booking/hotel_home_screen.dart | 157 +- .../lib/hotel_booking/hotel_list_view.dart | 10 +- .../lib/hotel_booking/range_slider_view.dart | 36 +- .../lib/hotel_booking/slider_view.dart | 36 +- .../best_flutter_ui_templates/lib/main.dart | 14 +- .../lib/model/homelist.dart | 4 +- .../lib/navigation_home_screen.dart | 26 +- .../lib/plugins/net/fair_net_plugin.dart | 6 +- .../lib/src/fair/home_list_proxy.dart | 2 +- .../src/fair/hotel_list_content_proxy.dart | 8 +- .../lib/src/generated.fair.dart | 74 +- .../best_flutter_ui_templates/pubspec.yaml | 7 +- .../bottom_navy_bar/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../bottom_navy_bar/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- test_case/bottom_navy_bar/lib/home_page.dart | 2 +- test_case/bottom_navy_bar/lib/module.dart | 4 +- .../lib/src/generated.fair.dart | 8 + test_case/bottom_navy_bar/lib/theme.dart | 2 +- test_case/bottom_navy_bar/pubspec.yaml | 14 +- test_case/fair_bloc/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/fair_bloc/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../lib_counter_view_text_widget.fair.js | 2 +- .../lib_counter_view_text_widget.fair.json | 6 +- test_case/fair_bloc/build_runner.sh | 11 + test_case/fair_bloc/lib/app.dart | 2 +- .../lib/counter/view/counter_page.dart | 2 +- .../lib/counter/view/counter_view.dart | 2 +- .../lib/counter/view/text_widget.dart | 4 +- test_case/fair_bloc/lib/counter_observer.dart | 6 +- test_case/fair_bloc/pubspec.lock | 463 +- test_case/fair_bloc/pubspec.yaml | 14 +- .../fair_list_demo/android/app/build.gradle | 8 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/fair_list_demo/android/build.gradle | 20 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- test_case/fair_list_demo/build_runner.sh | 11 + test_case/fair_list_demo/pubspec.yaml | 3 +- test_case/fair_mobx/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/fair_mobx/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../assets/bundle/lib_text_widget.fair.js | 1 + .../assets/bundle/lib_text_widget.fair.json | 6 +- test_case/fair_mobx/build_runner.sh | 11 + test_case/fair_mobx/lib/counter.g.dart | 7 +- test_case/fair_mobx/lib/counter_widgets.dart | 2 +- test_case/fair_mobx/lib/main.dart | 2 +- test_case/fair_mobx/lib/text_widget.dart | 4 +- test_case/fair_mobx/pubspec.lock | 198 +- test_case/fair_mobx/pubspec.yaml | 15 +- .../fair_provider/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/fair_provider/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- test_case/fair_provider/lib/count_widget.dart | 2 +- test_case/fair_provider/lib/main.dart | 4 +- test_case/fair_provider/lib/my_home_page.dart | 2 +- test_case/fair_provider/lib/theme.dart | 2 +- test_case/fair_provider/pubspec.lock | 165 +- test_case/fair_provider/pubspec.yaml | 8 +- .../android/app/build.gradle | 8 +- .../fair_template_detail/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../assets/bundle/lib_fair_detail.fair.json | 3 +- .../fair_template_detail/build_runner.sh | 11 + test_case/fair_template_detail/pubspec.lock | 184 +- test_case/fair_template_detail/pubspec.yaml | 5 +- .../android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../flutter_component/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../assets/bundle/lib_home_page.fair.js | 1 + .../assets/bundle/lib_home_page.fair.json | 28 +- test_case/flutter_component/build_runner.sh | 11 + .../flutter_component/lib/home_page.dart | 55 +- test_case/flutter_component/lib/main.dart | 2 +- .../lib/src/generated.fair.dart | 689 +- test_case/flutter_component/pubspec.yaml | 6 +- .../flutter_libs_app/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../flutter_libs_app/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../lib/google_fonts/fair_google_fonts.dart | 514 - test_case/flutter_libs_app/pubspec.lock | 190 +- test_case/flutter_libs_app/pubspec.yaml | 9 +- .../flutter_slidable/android/app/build.gradle | 8 +- .../android/app/src/main/AndroidManifest.xml | 3 +- .../flutter_slidable/android/build.gradle | 22 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../assets/bundle/lib_home_page.fair.js | 1 + .../assets/bundle/lib_home_page.fair.json | 136 +- test_case/flutter_slidable/build_runner.sh | 11 + test_case/flutter_slidable/lib/home_page.dart | 98 +- test_case/flutter_slidable/lib/main.dart | 4 +- test_case/flutter_slidable/lib/module.dart | 2 +- .../lib/src/generated.fair.dart | 167 +- test_case/flutter_slidable/lib/theme.dart | 2 +- test_case/flutter_slidable/pubspec.yaml | 8 +- .../list_card_demo/android/app/build.gradle | 8 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/list_card_demo/android/build.gradle | 20 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../bundle/lib_view_list_card_item.fair.js | 2 +- .../bundle/lib_view_list_card_item.fair.json | 7 +- .../bundle/lib_view_moments_list.fair.js | 2 +- .../bundle/lib_view_moments_list.fair.json | 9 +- test_case/list_card_demo/build_runner.sh | 11 + .../lib/view/list_card_item.dart | 6 +- .../list_card_demo/lib/view/moments_list.dart | 3 +- test_case/list_card_demo/pubspec.lock | 463 +- test_case/list_card_demo/pubspec.yaml | 14 +- test_case/list_demo/android/app/build.gradle | 8 +- test_case/list_demo/android/build.gradle | 24 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../assets/bundle/lib_list_demo_page.fair.js | 2 +- .../bundle/lib_list_demo_page.fair.json | 23 +- .../assets/bundle/lib_list_item.fair.js | 2 +- .../assets/bundle/lib_list_item.fair.json | 5 +- test_case/list_demo/build_runner.sh | 11 + test_case/list_demo/lib/list_demo_page.dart | 4 +- test_case/list_demo/pubspec.lock | 414 +- test_case/list_demo/pubspec.yaml | 6 +- .../login_template/android/app/build.gradle | 6 +- test_case/login_template/android/build.gradle | 24 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../assets/fair/lib_login_login_page.fair.bin | Bin 2728 -> 0 bytes .../assets/fair/lib_login_login_page.fair.js | 2 +- .../fair/lib_login_login_page.fair.json | 3 +- test_case/login_template/build_runner.sh | 11 + test_case/login_template/pubspec.lock | 191 +- test_case/login_template/pubspec.yaml | 14 +- test_case/my_app/.gitignore | 42 - test_case/my_app/.metadata | 10 - test_case/my_app/README.md | 16 - test_case/my_app/android/.gitignore | 11 - test_case/my_app/android/app/build.gradle | 63 - .../android/app/src/debug/AndroidManifest.xml | 7 - .../android/app/src/main/AndroidManifest.xml | 46 - .../kotlin/com/example/my_app/MainActivity.kt | 6 - .../main/res/drawable/launch_background.xml | 12 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../app/src/main/res/values/styles.xml | 18 - .../app/src/profile/AndroidManifest.xml | 7 - test_case/my_app/android/build.gradle | 31 - test_case/my_app/android/gradle.properties | 4 - .../gradle/wrapper/gradle-wrapper.properties | 6 - test_case/my_app/android/settings.gradle | 11 - .../assets/bundle/lib_home_page.fair.js | 1 - .../assets/bundle/lib_home_page.fair.json | 92 - test_case/my_app/ios/.gitignore | 32 - .../my_app/ios/Flutter/AppFrameworkInfo.plist | 26 - test_case/my_app/ios/Flutter/Debug.xcconfig | 2 - test_case/my_app/ios/Flutter/Release.xcconfig | 2 - test_case/my_app/ios/Podfile | 41 - test_case/my_app/ios/Podfile.lock | 28 - .../ios/Runner.xcodeproj/project.pbxproj | 576 - .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - test_case/my_app/ios/Runner/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 122 - .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 - .../ios/Runner/Base.lproj/Main.storyboard | 26 - test_case/my_app/ios/Runner/Info.plist | 47 - .../ios/Runner/Runner-Bridging-Header.h | 1 - test_case/my_app/lib/custom.dart | 11 - test_case/my_app/lib/delegate.dart | 41 - test_case/my_app/lib/home_page.dart | 71 - test_case/my_app/lib/main.dart | 43 - test_case/my_app/lib/src/generated.fair.dart | 59 - test_case/my_app/lib/theme.dart | 15 - test_case/my_app/pubspec.yaml | 88 - test_case/my_app/test/widget_test.dart | 30 - test_case/my_app/web/favicon.png | Bin 917 -> 0 bytes test_case/my_app/web/icons/Icon-192.png | Bin 5292 -> 0 bytes test_case/my_app/web/icons/Icon-512.png | Bin 8252 -> 0 bytes test_case/my_app/web/index.html | 33 - test_case/my_app/web/manifest.json | 23 - test_case/sugar_demo/android/app/build.gradle | 6 +- .../android/app/src/main/AndroidManifest.xml | 1 + test_case/sugar_demo/android/build.gradle | 28 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../bundle/lib_sugar_elseif_test_page.fair.js | 2 +- .../lib_sugar_elseif_test_page.fair.json | 81 +- .../assets/bundle/lib_sugar_menu.fair.js | 2 +- .../assets/bundle/lib_sugar_menu.fair.json | 3 +- .../assets/bundle/lib_warp_demo.fair.js | 2 +- .../assets/bundle/lib_warp_demo.fair.json | 3 +- test_case/sugar_demo/build_runner.sh | 11 + test_case/sugar_demo/lib/main.dart | 2 - .../lib/sugar_elseif_test_page.dart | 120 +- test_case/sugar_demo/pubspec.lock | 404 +- test_case/sugar_demo/pubspec.yaml | 6 +- .../android/app/build.gradle | 6 +- .../sugar_demo_tabbar/android/build.gradle | 24 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- test_case/sugar_demo_tabbar/pubspec.lock | 167 +- test_case/sugar_demo_tabbar/pubspec.yaml | 6 +- 439 files changed, 23189 insertions(+), 5688 deletions(-) create mode 100644 example/build_runner.sh create mode 100644 flutter_version/flutter_3_13_0/CHANGELOG.md create mode 100644 flutter_version/flutter_3_13_0/LICENSE create mode 100644 flutter_version/flutter_3_13_0/README.md create mode 100644 flutter_version/flutter_3_13_0/analysis_options.yaml create mode 100755 flutter_version/flutter_3_13_0/autoImport create mode 100644 flutter_version/flutter_3_13_0/lib/fair_version.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/fair_utf8.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/part/c.part.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/part/w.part.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$a.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$c.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$m.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$p.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$r.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/$$w.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/all.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/module.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/utils.dart create mode 100644 flutter_version/flutter_3_13_0/lib/src/widgets/version.dart create mode 100644 flutter_version/flutter_3_13_0/pubspec.yaml create mode 100644 test_case/adobe_xd/assets/bundle/lib_Gear.fair.js create mode 100644 test_case/adobe_xd/assets/bundle/lib_Home.fair.js create mode 100644 test_case/adobe_xd/build_runner.sh create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_component_home_list.fair.js delete mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_grid_gridview_template.fair.metadata create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_meals_list_meals_list_view.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_my_diary_body_measurement.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_my_diary_glass_view.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_my_diary_mediterranean_diet.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_my_diary_water.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_trainning_area_of_focus.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_trainning_running.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_component_trainning_your_program.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_page_my_diary_page.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_fair_page_training_page.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_feedback_screen.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_help_screen.fair.js create mode 100644 test_case/best_flutter_ui_templates/assets/bundle/lib_invite_friend_screen.fair.js create mode 100644 test_case/best_flutter_ui_templates/build_runner.sh create mode 100644 test_case/best_flutter_ui_templates/lib/best_ui_page.dart delete mode 100644 test_case/best_flutter_ui_templates/lib/fitness_app/fintness_app_theme.dart create mode 100644 test_case/best_flutter_ui_templates/lib/fitness_app/traning/training_screen.dart create mode 100644 test_case/best_flutter_ui_templates/lib/hex_color.dart create mode 100644 test_case/fair_bloc/build_runner.sh create mode 100644 test_case/fair_list_demo/build_runner.sh create mode 100644 test_case/fair_mobx/assets/bundle/lib_text_widget.fair.js create mode 100644 test_case/fair_mobx/build_runner.sh create mode 100644 test_case/fair_template_detail/build_runner.sh create mode 100644 test_case/flutter_component/assets/bundle/lib_home_page.fair.js create mode 100644 test_case/flutter_component/build_runner.sh create mode 100644 test_case/flutter_slidable/assets/bundle/lib_home_page.fair.js create mode 100644 test_case/flutter_slidable/build_runner.sh create mode 100644 test_case/list_card_demo/build_runner.sh create mode 100644 test_case/list_demo/build_runner.sh delete mode 100644 test_case/login_template/assets/fair/lib_login_login_page.fair.bin create mode 100644 test_case/login_template/build_runner.sh delete mode 100644 test_case/my_app/.gitignore delete mode 100644 test_case/my_app/.metadata delete mode 100644 test_case/my_app/README.md delete mode 100644 test_case/my_app/android/.gitignore delete mode 100644 test_case/my_app/android/app/build.gradle delete mode 100644 test_case/my_app/android/app/src/debug/AndroidManifest.xml delete mode 100644 test_case/my_app/android/app/src/main/AndroidManifest.xml delete mode 100644 test_case/my_app/android/app/src/main/kotlin/com/example/my_app/MainActivity.kt delete mode 100644 test_case/my_app/android/app/src/main/res/drawable/launch_background.xml delete mode 100644 test_case/my_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 test_case/my_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 test_case/my_app/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 test_case/my_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 test_case/my_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 test_case/my_app/android/app/src/main/res/values/styles.xml delete mode 100644 test_case/my_app/android/app/src/profile/AndroidManifest.xml delete mode 100644 test_case/my_app/android/build.gradle delete mode 100644 test_case/my_app/android/gradle.properties delete mode 100644 test_case/my_app/android/gradle/wrapper/gradle-wrapper.properties delete mode 100644 test_case/my_app/android/settings.gradle delete mode 100644 test_case/my_app/assets/bundle/lib_home_page.fair.js delete mode 100644 test_case/my_app/assets/bundle/lib_home_page.fair.json delete mode 100644 test_case/my_app/ios/.gitignore delete mode 100644 test_case/my_app/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 test_case/my_app/ios/Flutter/Debug.xcconfig delete mode 100644 test_case/my_app/ios/Flutter/Release.xcconfig delete mode 100644 test_case/my_app/ios/Podfile delete mode 100644 test_case/my_app/ios/Podfile.lock delete mode 100644 test_case/my_app/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 test_case/my_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 test_case/my_app/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 test_case/my_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 test_case/my_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 test_case/my_app/ios/Runner/AppDelegate.swift delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 test_case/my_app/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 test_case/my_app/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 test_case/my_app/ios/Runner/Info.plist delete mode 100644 test_case/my_app/ios/Runner/Runner-Bridging-Header.h delete mode 100644 test_case/my_app/lib/custom.dart delete mode 100644 test_case/my_app/lib/delegate.dart delete mode 100644 test_case/my_app/lib/home_page.dart delete mode 100644 test_case/my_app/lib/main.dart delete mode 100644 test_case/my_app/lib/src/generated.fair.dart delete mode 100644 test_case/my_app/lib/theme.dart delete mode 100644 test_case/my_app/pubspec.yaml delete mode 100644 test_case/my_app/test/widget_test.dart delete mode 100644 test_case/my_app/web/favicon.png delete mode 100644 test_case/my_app/web/icons/Icon-192.png delete mode 100644 test_case/my_app/web/icons/Icon-512.png delete mode 100644 test_case/my_app/web/index.html delete mode 100644 test_case/my_app/web/manifest.json create mode 100644 test_case/sugar_demo/build_runner.sh diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 2c639d59..2822bb67 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -35,8 +35,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.example" - minSdkVersion 19 - targetSdkVersion 30 + minSdkVersion 20 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -55,5 +55,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 34dd77ef..3da38e30 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -9,7 +9,8 @@ android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" - android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="adjustResize" + android:exported="true"> 0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MyHomePageState.prototype.ctor.apply(this,args);return this;}}_MyHomePageState.__inner__=function inner(){};_MyHomePageState.prototype={onTagClick:function onTagClick(){const __thiz__=this;with(__thiz__){print('11111');}},};_MyHomePageState.prototype.ctor=function(){};;return _MyHomePageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/flutter_slidable/assets/bundle/lib_home_page.fair.json b/test_case/flutter_slidable/assets/bundle/lib_home_page.fair.json index d52c6062..1f092fa2 100644 --- a/test_case/flutter_slidable/assets/bundle/lib_home_page.fair.json +++ b/test_case/flutter_slidable/assets/bundle/lib_home_page.fair.json @@ -16,77 +16,89 @@ "className": "Center", "na": { "child": { - "className": "Column", + "className": "Sugar.listBuilder", "na": { - "mainAxisAlignment": "#(MainAxisAlignment.center)", - "children": [ - { - "className": "Slidable", - "na": { - "actionPane": { - "className": "SlidableScrollActionPane" - }, - "actionExtentRatio": 0.25, - "child": { - "className": "Container", - "na": { - "height": 60, - "decoration": { - "className": "BoxDecoration", - "na": { - "color": "#(Colors.green)" - } - }, - "width": "#(double.infinity)" - } - }, - "actions": [ - { - "className": "IconSlideAction", + "itemCount": 1, + "shrinkWrap": true, + "itemBuilder": { + "className": "Slidable", + "na": { + "actionPane": { + "className": "SlidableScrollActionPane" + }, + "actionExtentRatio": 0.25, + "child": { + "className": "Container", + "na": { + "height": 60, + "decoration": { + "className": "BoxDecoration", "na": { - "caption": "title", - "color": "#(Colors.blue)", - "icon": "#(Icons.archive)", - "onTap": "#(onTagClick)" + "color": "#(Colors.green)" } }, - { - "className": "IconSlideAction", - "na": { - "caption": "Share", - "color": "#(Colors.indigo)", - "icon": "#(Icons.share)", - "onTap": "#(onTagClick)" - } + "width": { + "className": "Sugar.width", + "pa": [ + "^(context)" + ] } - ], - "secondaryActions": [ - { - "className": "IconSlideAction", - "na": { - "caption": "More", - "color": "#(Colors.black45)", - "icon": "#(Icons.more_horiz)", - "onTap": "#(onTagClick)" - } - }, - { - "className": "IconSlideAction", - "na": { - "caption": "Delete", - "color": "#(Colors.red)", - "icon": "#(Icons.delete)", - "closeOnTap": false, - "onTap": "#(onTagClick)" - } + } + }, + "actions": [ + { + "className": "IconSlideAction", + "na": { + "caption": "title", + "color": "#(Colors.blue)", + "icon": "#(Icons.archive)", + "onTap": "#(onTagClick)" + } + }, + { + "className": "IconSlideAction", + "na": { + "caption": "Share", + "color": "#(Colors.indigo)", + "icon": "#(Icons.share)", + "onTap": "#(onTagClick)" + } + } + ], + "secondaryActions": [ + { + "className": "IconSlideAction", + "na": { + "caption": "More", + "color": "#(Colors.black45)", + "icon": "#(Icons.more_horiz)", + "onTap": "#(onTagClick)" + } + }, + { + "className": "IconSlideAction", + "na": { + "caption": "Delete", + "color": "#(Colors.red)", + "icon": "#(Icons.delete)", + "closeOnTap": false, + "onTap": "#(onTagClick)" } - ] - } + } + ] + }, + "functionParameters": { + "pa": [ + "context", + "index" + ] } - ] + } } } } } - } + }, + "methodMap": {}, + "digest": "aa463484cabe4ec526f1dcb95fdde7ea" } \ No newline at end of file diff --git a/test_case/flutter_slidable/build_runner.sh b/test_case/flutter_slidable/build_runner.sh new file mode 100644 index 00000000..93af922f --- /dev/null +++ b/test_case/flutter_slidable/build_runner.sh @@ -0,0 +1,11 @@ +fvm flutter clean + +echo "----- flutter clean finish -----" + +fvm flutter pub get + +echo "----- flutter pub get finish -----" + +fvm flutter pub run build_runner build --delete-conflicting-outputs + +echo "----- flutter pub run build_runner build finish -----" diff --git a/test_case/flutter_slidable/lib/home_page.dart b/test_case/flutter_slidable/lib/home_page.dart index ecb13d21..4e52c32e 100644 --- a/test_case/flutter_slidable/lib/home_page.dart +++ b/test_case/flutter_slidable/lib/home_page.dart @@ -9,7 +9,7 @@ import 'package:flutter_slidable/flutter_slidable.dart'; @FairPatch() class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); + MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @@ -25,55 +25,55 @@ class _MyHomePageState extends State { title: Text(widget.title), ), body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Slidable( - actionPane: SlidableScrollActionPane(), - //滑出选项的面板 动画 - actionExtentRatio: 0.25, - child: Container( - height: 60, - decoration: new BoxDecoration( - color: Colors.green, + //must wrap with scrollable widget + child: Sugar.listBuilder( + itemCount: 1, + shrinkWrap: true, + itemBuilder: (context, index) { + return Slidable( + actionPane: SlidableScrollActionPane(), + //滑出选项的面板 动画 + actionExtentRatio: 0.25, + child: Container( + height: 60, + decoration: new BoxDecoration( + color: Colors.green, + ), + width: Sugar.width(context), ), - width: double.infinity, - ), - actions: [ - //左侧按钮列表 - IconSlideAction( - caption: "title", - color: Colors.blue, - icon: Icons.archive, - onTap: onTagClick, - ), - IconSlideAction( - caption: 'Share', - color: Colors.indigo, - icon: Icons.share, - onTap: onTagClick, - ), - ], - secondaryActions: [ - //右侧按钮列表 - IconSlideAction( - caption: 'More', - color: Colors.black45, - icon: Icons.more_horiz, - onTap: onTagClick, - ), - IconSlideAction( - caption: 'Delete', - color: Colors.red, - icon: Icons.delete, - closeOnTap: false, - onTap: onTagClick, - ), - ], - ) - //AnimateWidget(), - ], - ), + actions: [ + //左侧按钮列表 + IconSlideAction( + caption: "title", + color: Colors.blue, + icon: Icons.archive, + onTap: onTagClick, + ), + IconSlideAction( + caption: 'Share', + color: Colors.indigo, + icon: Icons.share, + onTap: onTagClick, + ), + ], + secondaryActions: [ + //右侧按钮列表 + IconSlideAction( + caption: 'More', + color: Colors.black45, + icon: Icons.more_horiz, + onTap: onTagClick, + ), + IconSlideAction( + caption: 'Delete', + color: Colors.red, + icon: Icons.delete, + closeOnTap: false, + onTap: onTagClick, + ), + ], + ); + }) ), ); } diff --git a/test_case/flutter_slidable/lib/main.dart b/test_case/flutter_slidable/lib/main.dart index 175f4d38..187cce02 100644 --- a/test_case/flutter_slidable/lib/main.dart +++ b/test_case/flutter_slidable/lib/main.dart @@ -3,14 +3,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_slidables/src/generated.fair.dart'; import 'delegate.dart'; -import 'home_page.dart'; -import 'module.dart'; @FairBinding(packages: [ 'package:flutter_slidable/flutter_slidable.dart',]) void main() { WidgetsFlutterBinding.ensureInitialized(); - runApp(FairApp( + FairApp.runApplication(FairApp( child: MyApp(), // modules: { // SlidableModule.tagName:() => SlidableModule(), diff --git a/test_case/flutter_slidable/lib/module.dart b/test_case/flutter_slidable/lib/module.dart index 4a10a5b0..984d790d 100644 --- a/test_case/flutter_slidable/lib/module.dart +++ b/test_case/flutter_slidable/lib/module.dart @@ -10,7 +10,7 @@ class SlidableModule extends FairModule{ SlidableModule() : super(tagName); @override - SlidableScrollActionPane onCreateComponent(BuildContext ctx, Map props) { + SlidableScrollActionPane onCreateComponent(BuildContext ctx, Map? props) { return SlidableScrollActionPane(); } diff --git a/test_case/flutter_slidable/lib/src/generated.fair.dart b/test_case/flutter_slidable/lib/src/generated.fair.dart index 6e4b1ef4..b8c4e3ff 100644 --- a/test_case/flutter_slidable/lib/src/generated.fair.dart +++ b/test_case/flutter_slidable/lib/src/generated.fair.dart @@ -1,44 +1,83 @@ -// Generated by Fair on 2021-06-24 15:41:36.773641. +// GENERATED CODE - DO NOT MODIFY MANUALLY +// ************************************************************************** +// But you can define a new GeneratedModule as following: +// class MyAppGeneratedModule extends AppGeneratedModule { +// @override +// Map components() { +// return { +// ...super.components(), +// // add your cases here. +// }; +// } +// +// /// true means it's a widget. +// @override +// Map mapping() { +// return { +// ...super.mapping(), +// // remember add your cases here too. +// }; +// } +// } +// ************************************************************************** +// Auto generated by https://github.com/wuba/Fair +// ************************************************************************** +// +// ignore_for_file: implementation_imports, unused_import, depend_on_referenced_packages, unused_shown_name, duplicate_import, always_specify_types, unnecessary_import + import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:flutter_slidable/src/widgets/slidable.dart'; import 'package:flutter_slidable/src/widgets/slide_action.dart'; import 'package:flutter_slidable/src/widgets/slidable_action_pane.dart'; import 'package:flutter_slidable/src/widgets/slidable_dismissal.dart'; import 'package:flutter_slidable/src/widgets/fractionnally_aligned_sized_box.dart'; +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; import 'package:fair/fair.dart'; import 'package:fair_version/fair_version.dart'; +const Duration _kResizeDuration = Duration(milliseconds: 300); +const bool _kCloseOnTap = true; +const double _kActionsExtentRatio = 0.25; +const Duration _kMovementDuration = Duration(milliseconds: 200); + class AppGeneratedModule extends GeneratedModule { @override Map components() { return { - 'IconSlideAction': (props) => IconSlideAction( + 'FractionallyAlignedSizedBox': (props) => FractionallyAlignedSizedBox( key: props['key'], - icon: props['icon'], - iconWidget: props['iconWidget'], - caption: props['caption'], - color: props['color'], - foregroundColor: props['foregroundColor'], - onTap: props['onTap'], - closeOnTap: props['closeOnTap'] ?? true, + child: props['child'], + leftFactor: props['leftFactor']?.toDouble(), + topFactor: props['topFactor']?.toDouble(), + rightFactor: props['rightFactor']?.toDouble(), + bottomFactor: props['bottomFactor']?.toDouble(), + widthFactor: props['widthFactor']?.toDouble(), + heightFactor: props['heightFactor']?.toDouble(), ), - 'SlideAction': (props) => SlideAction( + 'SlidableStrechActionPane': (props) => SlidableStrechActionPane( + key: props['key'], + ), + 'SlidableBehindActionPane': (props) => SlidableBehindActionPane( + key: props['key'], + ), + 'SlidableScrollActionPane': (props) => SlidableScrollActionPane( + key: props['key'], + ), + 'SlidableDrawerActionPane': (props) => SlidableDrawerActionPane( key: props['key'], - child: props['child'], - onTap: props['onTap'], - color: props['color'], - decoration: props['decoration'], - closeOnTap: props['closeOnTap'] ?? true, ), 'SlidableDismissal': (props) => SlidableDismissal( + key: props['key'], child: props['child'], dismissThresholds: props['dismissThresholds'] ?? const {}, onResize: props['onResize'], onDismissed: props['onDismissed'], - resizeDuration: props['resizeDuration'] ?? const Duration(milliseconds: 200), + resizeDuration: props['resizeDuration'] ?? _kResizeDuration, crossAxisEndOffset: props['crossAxisEndOffset']?.toDouble() ?? 0.0, onWillDismiss: props['onWillDismiss'], closeOnCanceled: props['closeOnCanceled'] ?? false, @@ -47,15 +86,42 @@ class AppGeneratedModule extends GeneratedModule { 'SlidableDrawerDismissal': (props) => SlidableDrawerDismissal( key: props['key'], ), - 'FractionallyAlignedSizedBox': (props) => FractionallyAlignedSizedBox( + 'SlideAction': (props) => SlideAction( key: props['key'], child: props['child'], - leftFactor: props['leftFactor']?.toDouble(), - topFactor: props['topFactor']?.toDouble(), - rightFactor: props['rightFactor']?.toDouble(), - bottomFactor: props['bottomFactor']?.toDouble(), - widthFactor: props['widthFactor']?.toDouble(), - heightFactor: props['heightFactor']?.toDouble(), + onTap: props['onTap'], + color: props['color'], + decoration: props['decoration'], + closeOnTap: props['closeOnTap'] ?? _kCloseOnTap, + ), + 'IconSlideAction': (props) => IconSlideAction( + key: props['key'], + icon: props['icon'], + iconWidget: props['iconWidget'], + caption: props['caption'], + color: props['color'], + foregroundColor: props['foregroundColor'], + onTap: props['onTap'], + closeOnTap: props['closeOnTap'] ?? _kCloseOnTap, + ), + 'SlidableData': (props) => SlidableData( + key: props['key'], + actionType: props['actionType'], + renderingMode: props['renderingMode'], + totalActionsExtent: props['totalActionsExtent']?.toDouble() ?? 0, + dismissThreshold: props['dismissThreshold']?.toDouble() ?? 0, + dismissible: props['dismissible'], + actionDelegate: props['actionDelegate'], + overallMoveAnimation: props['overallMoveAnimation'], + actionsMoveAnimation: props['actionsMoveAnimation'], + dismissAnimation: props['dismissAnimation'], + slidable: props['slidable'], + actionExtentRatio: props['actionExtentRatio']?.toDouble() ?? 0, + direction: props['direction'], + child: props['child'], + ), + 'SlidableData.of': (props) => SlidableData.of( + props['pa'][0], ), 'Slidable': (props) => Slidable( key: props['key'], @@ -66,8 +132,8 @@ class AppGeneratedModule extends GeneratedModule { showAllActionsThreshold: props['showAllActionsThreshold']?.toDouble() ?? 0.5, actionExtentRatio: - props['actionExtentRatio']?.toDouble() ?? 0.25, - movementDuration: props['movementDuration'] ?? const Duration(milliseconds: 200), + props['actionExtentRatio']?.toDouble() ?? _kActionsExtentRatio, + movementDuration: props['movementDuration'] ?? _kMovementDuration, direction: props['direction'] ?? Axis.horizontal, closeOnScroll: props['closeOnScroll'] ?? true, enabled: props['enabled'] ?? true, @@ -84,8 +150,8 @@ class AppGeneratedModule extends GeneratedModule { showAllActionsThreshold: props['showAllActionsThreshold']?.toDouble() ?? 0.5, actionExtentRatio: - props['actionExtentRatio']?.toDouble() ?? 0.25, - movementDuration: props['movementDuration'] ?? const Duration(milliseconds: 200), + props['actionExtentRatio']?.toDouble() ?? _kActionsExtentRatio, + movementDuration: props['movementDuration'] ?? _kMovementDuration, direction: props['direction'] ?? Axis.horizontal, closeOnScroll: props['closeOnScroll'] ?? true, enabled: props['enabled'] ?? true, @@ -93,46 +159,21 @@ class AppGeneratedModule extends GeneratedModule { controller: props['controller'], fastThreshold: props['fastThreshold']?.toDouble(), ), - 'SlidableData': (props) => SlidableData( - key: props['key'], - actionType: props['actionType'], - renderingMode: props['renderingMode'], - totalActionsExtent: props['totalActionsExtent']?.toDouble(), - dismissThreshold: props['dismissThreshold']?.toDouble(), - dismissible: props['dismissible'], - actionDelegate: props['actionDelegate'], - overallMoveAnimation: props['overallMoveAnimation'], - actionsMoveAnimation: props['actionsMoveAnimation'], - dismissAnimation: props['dismissAnimation'], - slidable: props['slidable'], - actionExtentRatio: props['actionExtentRatio']?.toDouble(), - direction: props['direction'], - child: props['child'], + 'Slidable.of': (props) => Slidable.of( + props['pa'][0], ), 'SlidableRenderingMode': { - 'values': SlidableRenderingMode.values, 'none': SlidableRenderingMode.none, 'slide': SlidableRenderingMode.slide, 'dismiss': SlidableRenderingMode.dismiss, 'resize': SlidableRenderingMode.resize, + 'values': SlidableRenderingMode.values, }, 'SlideActionType': { - 'values': SlideActionType.values, 'primary': SlideActionType.primary, 'secondary': SlideActionType.secondary, + 'values': SlideActionType.values, }, - 'SlidableBehindActionPane': (props) => SlidableBehindActionPane( - key: props['key'], - ), - 'SlidableDrawerActionPane': (props) => SlidableDrawerActionPane( - key: props['key'], - ), - 'SlidableScrollActionPane': (props) => SlidableScrollActionPane( - key: props['key'], - ), - 'SlidableStrechActionPane': (props) => SlidableStrechActionPane( - key: props['key'], - ), }; } @@ -140,17 +181,17 @@ class AppGeneratedModule extends GeneratedModule { Map mapping() { return const { 'FractionallyAlignedSizedBox': true, - 'IconSlideAction': true, - 'Slidable': true, + 'SlidableStrechActionPane': true, 'SlidableBehindActionPane': true, - 'SlidableData': true, - 'SlidableDismissal': true, + 'SlidableScrollActionPane': true, 'SlidableDrawerActionPane': true, + 'SlidableDismissal': true, 'SlidableDrawerDismissal': true, - 'SlidableRenderingMode': false, - 'SlidableScrollActionPane': true, - 'SlidableStrechActionPane': true, 'SlideAction': true, + 'IconSlideAction': true, + 'SlidableData': true, + 'Slidable': true, + 'SlidableRenderingMode': false, 'SlideActionType': false, }; } diff --git a/test_case/flutter_slidable/lib/theme.dart b/test_case/flutter_slidable/lib/theme.dart index 6eae7b91..611c10c6 100644 --- a/test_case/flutter_slidable/lib/theme.dart +++ b/test_case/flutter_slidable/lib/theme.dart @@ -10,6 +10,6 @@ import 'package:flutter/painting.dart'; import 'package:flutter/widgets.dart'; class ThemeStyle { - static TextStyle headline4(BuildContext context) => + static TextStyle? headline4(BuildContext context) => Theme.of(context).textTheme.headline4; } diff --git a/test_case/flutter_slidable/pubspec.yaml b/test_case/flutter_slidable/pubspec.yaml index cdd0e88a..d72eb891 100644 --- a/test_case/flutter_slidable/pubspec.yaml +++ b/test_case/flutter_slidable/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: @@ -41,8 +41,12 @@ dev_dependencies: # Switch to another stable flutter version dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_3_0_0 + path: ../../flutter_version/flutter_3_13_0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test_case/list_card_demo/android/app/build.gradle b/test_case/list_card_demo/android/app/build.gradle index 472e102c..445d3e38 100644 --- a/test_case/list_card_demo/android/app/build.gradle +++ b/test_case/list_card_demo/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 31 + compileSdkVersion 33 sourceSets { main.java.srcDirs += 'src/main/kotlin' @@ -39,8 +39,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.fairwith.fairbloc" - minSdkVersion 19 - targetSdkVersion 29 + minSdkVersion 20 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -59,5 +59,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/test_case/list_card_demo/android/app/src/main/AndroidManifest.xml b/test_case/list_card_demo/android/app/src/main/AndroidManifest.xml index 2b1c4828..e7027fed 100644 --- a/test_case/list_card_demo/android/app/src/main/AndroidManifest.xml +++ b/test_case/list_card_demo/android/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ android:icon="@mipmap/ic_launcher"> 0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListCardItemState.prototype.ctor.apply(this,args);return this;}}_ListCardItemState.__inner__=function inner(){};_ListCardItemState.prototype={};_ListCardItemState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _ListCardItemState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ListCardItemState(){const inner=_ListCardItemState.__inner__;if(this==__global__){return new _ListCardItemState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListCardItemState.prototype.ctor.apply(this,args);return this;}}_ListCardItemState.__inner__=function inner(){};_ListCardItemState.prototype={};_ListCardItemState.prototype.ctor=function(){};;return _ListCardItemState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/list_card_demo/assets/bundle/lib_view_list_card_item.fair.json b/test_case/list_card_demo/assets/bundle/lib_view_list_card_item.fair.json index 796e7fc9..ee131c7e 100644 --- a/test_case/list_card_demo/assets/bundle/lib_view_list_card_item.fair.json +++ b/test_case/list_card_demo/assets/bundle/lib_view_list_card_item.fair.json @@ -33,7 +33,7 @@ "na": { "radius": 30, "backgroundImage": { - "className": "Sugar.netWorkImage", + "className": "NetworkImage", "pa": [ "http://c-ssl.duitang.com/uploads/item/202003/26/20200326223552_nayyt.jpeg" ] @@ -134,7 +134,7 @@ "className": "Image", "na": { "image": { - "className": "Sugar.netWorkImage", + "className": "NetworkImage", "pa": [ "https://img2.baidu.com/it/u=4114138728,2649938841&fm=253&fmt=auto&app=138&f=JPEG" ] @@ -273,5 +273,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "032fd34d6a9d44cfd69824a29e29bdfa" } \ No newline at end of file diff --git a/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.js b/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.js index 23436393..a5f74744 100644 --- a/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.js +++ b/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _MomentsListState(){const inner=_MomentsListState.__inner__;if(this==__global__){return new _MomentsListState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MomentsListState.prototype.ctor.apply(this,args);return this;}}_MomentsListState.__inner__=function inner(){};_MomentsListState.prototype={};_MomentsListState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _MomentsListState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _MomentsListState(){const inner=_MomentsListState.__inner__;if(this==__global__){return new _MomentsListState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MomentsListState.prototype.ctor.apply(this,args);return this;}}_MomentsListState.__inner__=function inner(){};_MomentsListState.prototype={};_MomentsListState.prototype.ctor=function(){};;return _MomentsListState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.json b/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.json index b3bd3098..458476a0 100644 --- a/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.json +++ b/test_case/list_card_demo/assets/bundle/lib_view_moments_list.fair.json @@ -112,6 +112,12 @@ "data": { "": "" } + }, + "functionParameters": { + "pa": [ + "context", + "index" + ] } } } @@ -121,5 +127,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "b92d883946d0398a70892457032b1b4e" } \ No newline at end of file diff --git a/test_case/list_card_demo/build_runner.sh b/test_case/list_card_demo/build_runner.sh new file mode 100644 index 00000000..93af922f --- /dev/null +++ b/test_case/list_card_demo/build_runner.sh @@ -0,0 +1,11 @@ +fvm flutter clean + +echo "----- flutter clean finish -----" + +fvm flutter pub get + +echo "----- flutter pub get finish -----" + +fvm flutter pub run build_runner build --delete-conflicting-outputs + +echo "----- flutter pub run build_runner build finish -----" diff --git a/test_case/list_card_demo/lib/view/list_card_item.dart b/test_case/list_card_demo/lib/view/list_card_item.dart index eeedd5e4..7d602383 100644 --- a/test_case/list_card_demo/lib/view/list_card_item.dart +++ b/test_case/list_card_demo/lib/view/list_card_item.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; @FairPatch() class ListCardItem extends StatefulWidget { - const ListCardItem({Key key}) : super(key: key); + const ListCardItem({Key? key}) : super(key: key); @override State createState() => _ListCardItemState(); @@ -24,7 +24,7 @@ class _ListCardItemState extends State { children: [ CircleAvatar( radius: 30, - backgroundImage: Sugar.netWorkImage( + backgroundImage: NetworkImage( "http://c-ssl.duitang.com/uploads/item/202003/26/20200326223552_nayyt.jpeg"), ), SizedBox( @@ -65,7 +65,7 @@ class _ListCardItemState extends State { ), Card( child: Image( - image: Sugar.netWorkImage( + image: NetworkImage( "https://img2.baidu.com/it/u=4114138728,2649938841&fm=253&fmt=auto&app=138&f=JPEG"), ), ), diff --git a/test_case/list_card_demo/lib/view/moments_list.dart b/test_case/list_card_demo/lib/view/moments_list.dart index 84e15367..23e655bd 100644 --- a/test_case/list_card_demo/lib/view/moments_list.dart +++ b/test_case/list_card_demo/lib/view/moments_list.dart @@ -1,10 +1,9 @@ import 'package:fair/fair.dart'; -import 'package:fairbloc/view/list_card_item.dart'; import 'package:flutter/material.dart'; @FairPatch() class MomentsList extends StatefulWidget { - const MomentsList({Key key}) : super(key: key); + const MomentsList({Key? key}) : super(key: key); @override State createState() => _MomentsListState(); diff --git a/test_case/list_card_demo/pubspec.lock b/test_case/list_card_demo/pubspec.lock index 2441005b..387d3b2c 100644 --- a/test_case/list_card_demo/pubspec.lock +++ b/test_case/list_card_demo/pubspec.lock @@ -5,196 +5,207 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 + url: "https://pub.flutter-io.cn" source: hosted - version: "31.0.0" + version: "54.0.0" analyzer: - dependency: transitive + dependency: "direct overridden" description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.0" + version: "5.6.0" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.3.0" + version: "3.4.6" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.0" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.9.0" + version: "2.11.0" bloc: dependency: "direct main" description: name: bloc - url: "https://pub.dartlang.org" + sha256: "6f1b87b6eca9041d5672b6e29273cd1594db48ebb66fd2471066e9f3c3a516bd" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.3" + version: "7.2.1" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.4.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.0" + version: "4.0.0" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.4" + version: "2.4.1" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.flutter-io.cn" source: hosted - version: "7.1.0" + version: "7.2.11" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://pub.flutter-io.cn" source: hosted - version: "8.2.0" + version: "8.7.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.5" + version: "2.0.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.1.0" + version: "4.7.0" collection: - dependency: transitive + dependency: "direct overridden" description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.4" + version: "1.0.6" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.1" + version: "2.2.5" fair: dependency: "direct main" description: path: "../../fair" relative: true source: path - version: "2.8.1" + version: "3.3.0" fair_annotation: dependency: transitive description: name: fair_annotation - url: "https://pub.dartlang.org" + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" fair_compiler: @@ -203,61 +214,68 @@ packages: path: "../../compiler" relative: true source: path - version: "1.4.1-dev.1" + version: "1.8.0" fair_dart2dsl: dependency: transitive description: name: fair_dart2dsl - url: "https://pub.dartlang.org" + sha256: a4e859678c0dcad711d688c0e82998fde5e75d2f5f5620d9b2c6d7426d22acbd + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.4.0" fair_dart2js: dependency: transitive description: name: fair_dart2js - url: "https://pub.dartlang.org" + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_3_3_0" + path: "../../flutter_version/flutter_3_13_0" relative: true source: path - version: "3.0.0" + version: "3.13.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.2" + version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.2" + version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.1.0" flat_buffers: dependency: transitive description: name: flat_buffers - url: "https://pub.dartlang.org" + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.5" flutter: @@ -269,16 +287,18 @@ packages: dependency: "direct main" description: name: flutter_bloc - url: "https://pub.dartlang.org" + sha256: cdd1351ced09eeb46cfa7946e095b7679344af927415ca9cd972928fa6d5b23f + url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.3" + version: "7.3.3" flutter_redux: dependency: "direct main" description: name: flutter_redux - url: "https://pub.dartlang.org" + sha256: "8985fd9a4f4016be6acc058818b7bc4cd43f65d134e6507a6e017ac5b499cd82" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.6.0" + version: "0.8.2" flutter_test: dependency: "direct dev" description: flutter @@ -293,205 +313,242 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.3.1" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.13.3" + version: "0.13.6" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.2.0" + version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.0.0" + version: "4.0.2" intl: dependency: transitive description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.flutter-io.cn" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.flutter-io.cn" source: hosted - version: "0.6.4" + version: "0.6.7" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.flutter-io.cn" source: hosted - version: "4.0.1" + version: "4.8.1" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.12" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.5" + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.1" + version: "1.0.4" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.2" + version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.8.3" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.7.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.5.0" + version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.2.3" + version: "4.2.4" provider: dependency: transitive description: name: provider - url: "https://pub.dartlang.org" + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.flutter-io.cn" source: hosted - version: "4.3.3" + version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.1" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.2.3" redux: dependency: transitive description: name: redux - url: "https://pub.dartlang.org" + sha256: "1e86ed5b1a9a717922d0a0ca41f9bf49c1a587d50050e9426fc65b14e85ec4d7" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.0.0+3" + version: "5.0.0" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.1" + version: "1.0.4" sky_engine: dependency: transitive description: flutter @@ -501,142 +558,186 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.2" + version: "1.4.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.9.0" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.12" + version: "0.6.0" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.3.2" url_launcher: dependency: transitive description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.10" + version: "6.2.1" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.0" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.3" + version: "3.1.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.3" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.5" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.7" + version: "2.2.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.2" + version: "3.1.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: - dependency: transitive + dependency: "direct overridden" description: name: watcher - url: "https://pub.dartlang.org" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.4.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "3.1.2" sdks: - dart: ">=2.17.0-0 <3.0.0" - flutter: ">=2.0.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.13.0" diff --git a/test_case/list_card_demo/pubspec.yaml b/test_case/list_card_demo/pubspec.yaml index a57c1468..afd2e547 100644 --- a/test_case/list_card_demo/pubspec.yaml +++ b/test_case/list_card_demo/pubspec.yaml @@ -6,20 +6,20 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.7.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.0 - bloc: ^6.1.3 - flutter_bloc: ^6.1.3 + bloc: ^7.0.0 + flutter_bloc: ^7.0.0 fair: path: ../../fair - flutter_redux: ^0.6.0 + flutter_redux: ^0.8.1 dev_dependencies: flutter_test: @@ -31,8 +31,12 @@ dev_dependencies: path: ../../compiler dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_3_3_0 + path: ../../flutter_version/flutter_3_13_0 flutter: diff --git a/test_case/list_demo/android/app/build.gradle b/test_case/list_demo/android/app/build.gradle index 5271e690..6079087a 100644 --- a/test_case/list_demo/android/app/build.gradle +++ b/test_case/list_demo/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -47,8 +47,8 @@ android { applicationId "com.example.list_demo" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion + minSdkVersion 20 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -67,5 +67,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/test_case/list_demo/android/build.gradle b/test_case/list_demo/android/build.gradle index 83ae2200..fb8d72f6 100644 --- a/test_case/list_demo/android/build.gradle +++ b/test_case/list_demo/android/build.gradle @@ -1,8 +1,12 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.8.0' repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } google() - mavenCentral() + jcenter() } dependencies { @@ -13,8 +17,20 @@ buildscript { allprojects { repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/google' + } + maven { + allowInsecureProtocol = true + url 'http://maven.aliyun.com/nexus/content/groups/public/' + } google() - mavenCentral() + jcenter() } } @@ -26,6 +42,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/test_case/list_demo/android/gradle/wrapper/gradle-wrapper.properties b/test_case/list_demo/android/gradle/wrapper/gradle-wrapper.properties index cb24abda..0e9a6105 100644 --- a/test_case/list_demo/android/gradle/wrapper/gradle-wrapper.properties +++ b/test_case/list_demo/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.js b/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.js index 6b345e2b..38ab0bec 100644 --- a/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.js +++ b/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ListDemoPageState(){const inner=_ListDemoPageState.__inner__;if(this==__global__){return new _ListDemoPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListDemoPageState.prototype.ctor.apply(this,args);return this;}}_ListDemoPageState.__inner__=function inner(){};_ListDemoPageState.prototype={};_ListDemoPageState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _ListDemoPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ListDemoPageState(){const inner=_ListDemoPageState.__inner__;if(this==__global__){return new _ListDemoPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListDemoPageState.prototype.ctor.apply(this,args);return this;}}_ListDemoPageState.__inner__=function inner(){};_ListDemoPageState.prototype={_incrementCounter:function _incrementCounter(){const __thiz__=this;with(__thiz__){}},};_ListDemoPageState.prototype.ctor=function(){};;return _ListDemoPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.json b/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.json index e3198fb5..760fd8c5 100644 --- a/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.json +++ b/test_case/list_demo/assets/bundle/lib_list_demo_page.fair.json @@ -1,6 +1,18 @@ { "className": "Scaffold", "na": { + "floatingActionButton": { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_incrementCounter)", + "child": { + "className": "Text", + "pa": [ + "Map View" + ] + } + } + }, "appBar": { "className": "AppBar", "na": { @@ -19,7 +31,7 @@ "^(context)" ] }, - 8 + 10 ] }, "child": { @@ -159,6 +171,12 @@ "data": { "": "" } + }, + "functionParameters": { + "pa": [ + "context", + "index" + ] } } } @@ -166,5 +184,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "705003bb62cfb22930abb9ab6df6bddb" } \ No newline at end of file diff --git a/test_case/list_demo/assets/bundle/lib_list_item.fair.js b/test_case/list_demo/assets/bundle/lib_list_item.fair.js index fd2a821d..7d0e6acc 100644 --- a/test_case/list_demo/assets/bundle/lib_list_item.fair.js +++ b/test_case/list_demo/assets/bundle/lib_list_item.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ListItemState(){const inner=_ListItemState.__inner__;if(this==__global__){return new _ListItemState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListItemState.prototype.ctor.apply(this,args);return this;}}_ListItemState.__inner__=function inner(){};_ListItemState.prototype={};_ListItemState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _ListItemState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ListItemState(){const inner=_ListItemState.__inner__;if(this==__global__){return new _ListItemState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ListItemState.prototype.ctor.apply(this,args);return this;}}_ListItemState.__inner__=function inner(){};_ListItemState.prototype={};_ListItemState.prototype.ctor=function(){};;return _ListItemState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/list_demo/assets/bundle/lib_list_item.fair.json b/test_case/list_demo/assets/bundle/lib_list_item.fair.json index bceab4e7..4156a67a 100644 --- a/test_case/list_demo/assets/bundle/lib_list_item.fair.json +++ b/test_case/list_demo/assets/bundle/lib_list_item.fair.json @@ -45,7 +45,7 @@ "na": { "fit": "#(BoxFit.fitHeight)", "image": { - "className": "Sugar.netWorkImage", + "className": "NetworkImage", "pa": [ "https://img.iplaysoft.com/wp-content/uploads/2019/free-images/free_stock_photo.jpg!0x0.webp" ] @@ -192,5 +192,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "73d80752f64aff517d52c27f0208a9ff" } \ No newline at end of file diff --git a/test_case/list_demo/build_runner.sh b/test_case/list_demo/build_runner.sh new file mode 100644 index 00000000..93af922f --- /dev/null +++ b/test_case/list_demo/build_runner.sh @@ -0,0 +1,11 @@ +fvm flutter clean + +echo "----- flutter clean finish -----" + +fvm flutter pub get + +echo "----- flutter pub get finish -----" + +fvm flutter pub run build_runner build --delete-conflicting-outputs + +echo "----- flutter pub run build_runner build finish -----" diff --git a/test_case/list_demo/lib/list_demo_page.dart b/test_case/list_demo/lib/list_demo_page.dart index 6c7eaa20..f19c4c5c 100644 --- a/test_case/list_demo/lib/list_demo_page.dart +++ b/test_case/list_demo/lib/list_demo_page.dart @@ -1,6 +1,5 @@ import 'package:fair/fair.dart'; import 'package:flutter/material.dart'; -import 'package:list_demo/list_item.dart'; @FairPatch() class ListDemoPage extends StatefulWidget { @@ -17,7 +16,6 @@ class _ListDemoPageState extends State { return Scaffold( floatingActionButton: ElevatedButton( onPressed: _incrementCounter, - style: Sugar.isButtonStyle(backgroundColor: Colors.deepPurple), child: const Text("Map View"), ), appBar: AppBar( @@ -25,7 +23,7 @@ class _ListDemoPageState extends State { backgroundColor: Colors.white, shadowColor: Colors.white, bottom: PreferredSize( - preferredSize: Size(Sugar.width(context), 8), + preferredSize: Size(Sugar.width(context), 10), child: const Material( color: Colors.white, child: Padding( diff --git a/test_case/list_demo/pubspec.lock b/test_case/list_demo/pubspec.lock index e7a3c4e7..366bd027 100644 --- a/test_case/list_demo/pubspec.lock +++ b/test_case/list_demo/pubspec.lock @@ -5,182 +5,199 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 + url: "https://pub.flutter-io.cn" source: hosted - version: "31.0.0" + version: "54.0.0" analyzer: - dependency: transitive + dependency: "direct overridden" description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.0" + version: "5.6.0" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.3.2" + version: "3.4.6" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.9.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.4.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "4.0.0" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.6" + version: "2.4.1" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.flutter-io.cn" source: hosted - version: "7.2.6" + version: "7.2.11" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://pub.flutter-io.cn" source: hosted - version: "8.4.1" + version: "8.7.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.5" + version: "2.0.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.3.0" + version: "4.7.0" collection: - dependency: transitive + dependency: "direct overridden" description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.2" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.5" + version: "1.0.6" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.1" + version: "2.2.5" fair: dependency: "direct main" description: path: "../../fair" relative: true source: path - version: "2.8.0" + version: "3.3.0" fair_annotation: dependency: transitive description: name: fair_annotation - url: "https://pub.dartlang.org" + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" fair_compiler: @@ -189,61 +206,68 @@ packages: path: "../../compiler" relative: true source: path - version: "1.3.0" + version: "1.8.0" fair_dart2dsl: dependency: transitive description: name: fair_dart2dsl - url: "https://pub.dartlang.org" + sha256: a4e859678c0dcad711d688c0e82998fde5e75d2f5f5620d9b2c6d7426d22acbd + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.1" + version: "1.4.0" fair_dart2js: dependency: transitive description: name: fair_dart2js - url: "https://pub.dartlang.org" + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_3_3_0" + path: "../../flutter_version/flutter_3_13_0" relative: true source: path - version: "3.0.0" + version: "3.13.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.1" + version: "1.1.0" flat_buffers: dependency: transitive description: name: flat_buffers - url: "https://pub.dartlang.org" + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.5" flutter: @@ -255,9 +279,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" + version: "2.0.3" flutter_test: dependency: "direct dev" description: flutter @@ -272,191 +297,226 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.3.1" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.13.5" + version: "0.13.6" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" intl: dependency: "direct dev" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.flutter-io.cn" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.flutter-io.cn" source: hosted - version: "0.6.4" + version: "0.6.7" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.flutter-io.cn" source: hosted - version: "4.7.0" + version: "4.8.1" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" + version: "2.1.1" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.12" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.5" + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.0.4" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.8.3" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.3" + version: "3.7.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.2.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.0.4" sky_engine: dependency: transitive description: flutter @@ -466,156 +526,186 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.2" + version: "1.4.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.9.0" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.12" + version: "0.6.0" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.1" + version: "1.3.2" url_launcher: dependency: transitive description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.6" + version: "6.2.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.19" + version: "6.2.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.17" + version: "6.2.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.1" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.13" + version: "2.2.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: - dependency: transitive + dependency: "direct overridden" description: name: watcher - url: "https://pub.dartlang.org" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=2.18.2 <3.0.0" - flutter: ">=2.10.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.13.0" diff --git a/test_case/list_demo/pubspec.yaml b/test_case/list_demo/pubspec.yaml index f918621a..b5ed4aee 100644 --- a/test_case/list_demo/pubspec.yaml +++ b/test_case/list_demo/pubspec.yaml @@ -41,8 +41,12 @@ dev_dependencies: flutter_lints: ^2.0.0 dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_3_3_0 + path: ../../flutter_version/flutter_3_13_0 flutter: uses-material-design: true diff --git a/test_case/login_template/android/app/build.gradle b/test_case/login_template/android/app/build.gradle index 5722b837..1caf3192 100644 --- a/test_case/login_template/android/app/build.gradle +++ b/test_case/login_template/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -48,7 +48,7 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 21 - targetSdkVersion flutter.targetSdkVersion + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } @@ -67,5 +67,5 @@ flutter { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/test_case/login_template/android/build.gradle b/test_case/login_template/android/build.gradle index 83ae2200..fb8d72f6 100644 --- a/test_case/login_template/android/build.gradle +++ b/test_case/login_template/android/build.gradle @@ -1,8 +1,12 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.8.0' repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } google() - mavenCentral() + jcenter() } dependencies { @@ -13,8 +17,20 @@ buildscript { allprojects { repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/google' + } + maven { + allowInsecureProtocol = true + url 'http://maven.aliyun.com/nexus/content/groups/public/' + } google() - mavenCentral() + jcenter() } } @@ -26,6 +42,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/test_case/login_template/android/gradle/wrapper/gradle-wrapper.properties b/test_case/login_template/android/gradle/wrapper/gradle-wrapper.properties index cc5527d7..bfd98901 100644 --- a/test_case/login_template/android/gradle/wrapper/gradle-wrapper.properties +++ b/test_case/login_template/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/test_case/login_template/assets/fair/lib_login_login_page.fair.bin b/test_case/login_template/assets/fair/lib_login_login_page.fair.bin deleted file mode 100644 index e9050fea5ae41294e2319b849807c7d1a8d0fd6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2728 zcmZuzeQX@X6@N23`*r?|y^e!poWt1*cSN}$2Luw8QafPD1ShE-HBwb2toPP;L-uyf z?mD(Z6;MN~0&zh|fI|2Pf3ywIQjl6i1gI*3Rv?5xfcTJFWGWQpk17&^0HtbqGdp&I zls%nx=gphg_=aL}h2ZP=5 z@PU}uM&c}sn`2QLWH1%i7Qhd^G~MAf1F*NnQReX|NFef{7Wi@EWjv0cZ6uz*{``

;ICH-~YZNBgGg)mvuj zK>8he#HEC8v7Is<5AbWe#c}EJBls2K7nvu7*e-qUQ54*7JFeg0VGWFJaX8zIK#r0i zf~J?CS?IW-Ru5#HX*G_*1<2wVAUfI@V)V-;v~d~QXpz2ErC-qhefPK@NBg9Y)tLw# z9B>)|uQxK77d{J@zf{tTqWNwb9z(;{Xj<)g}W8Nk)#qwiM?qk>b@+gY)QFST~YZcIbc*USbw5^x)JItZ*A97lt z@9RXD_DgOxXs6$jCke)JZ~Gk>2l_Zoek8Oyef5xlTIFjjHkezg)*$lFT`_PCJeoz!)2&5G~DliJi=^{n^ zD_b3RDo$!aGU3(uYzjRi7mTVtPyE@?OF*u9k2b}c!B$5^a1C6m_+JIr5f>x>f-Whq zKBf*hB}wrp53rm%#-f?o?0juwlL%1gUSF0oIchbEBP71TqfF+l?S`hu!{TtQhRv1& z7ETsK*)A3Afgs7aFM=v8Xa0cZYdMcLS%ti4^{d7)H9`BBQ*zMf2erc*MzFZbaj~0^ zXq1vx7v;}r$AtV@tQhQfs{K|wOLr3sXBhOrTbQj1aZ4qa!iU;x3gH8-4`bBe_n28- zli4Zc+4-+_M(J$QM0N=LoFGy`c(#V=GJ_PJmLBHPD*L-yal4R~DLg(X?ji*w7HVGtA)-LR^IiwV$>J?bB5AI~QsujIdvH=Ik^<*zG&<_m`lGT{Q zoR??VF{OEetU(!t6YOR{Mmk6dTN2)4FRJ->Wv?;Vz}{fpY@S+_b>DaT%@RJScaHr_ z>3zw1G4h_3o~kE75Doi2=C1<8!U`PJmu;rBQ^tH3y<23V<7%0!5q-0s=d!Gep3q>m z)~&@1nJ$-AA580$O6MUanD#=yGveqvdCa@9RA#EjO>uvpIeZQVFx0`jtHbg6f4hdYTzo);#*69VRXMIoq;4Y_B zVuA~5oK@C{aS3XpH65)Dh?oY979)>sr!F$nIT|PRAS*7XaVwB62T>npzhH-0j`}$3 zfm{o|5?| za8h_Ev$5CQZhoU;{1j(zS24b1{7%^GenG}~r+KTgaM;Xa{DZOF8^_H>HTRAodt)M= z!!wRY!}C0qyFOOX_yyx?lSdV}^de_jJ&x;PkRN9296UzUS?$NTL*elNr_4`{e;8P| zYlnuga8WW~wOA+3JVzVNUeSkc*%GjLlb9DbjW!cKl{?0b)-~8J^itfL)?EZ$?EAR0 z@6Yis6IHXtnlQ&r#Jgu1@7LCCR>jKkjv?OVk}m@33d*zAqXOkHq6}OFC7a_JwondI zbToL#dft3aV4PjX_}u!$T2vVSM~n>$gKov%gYuZuP+??0_=f(QYIq@=rJghrq|1TgjC_tfW`1kJL#u2=9{$ z?xl~}_t<%DeMQ7xio1ceWaW}B=%OW*ykh@R>HO6eIu@Sq03vRZ>8PZ>{Wo9X?E#&B13On#nrX5gfFm=V0 QH_=Joo1Vr?hUlE{0Mr!|3jhEB diff --git a/test_case/login_template/assets/fair/lib_login_login_page.fair.js b/test_case/login_template/assets/fair/lib_login_login_page.fair.js index 42e558bf..e5ea086e 100644 --- a/test_case/login_template/assets/fair/lib_login_login_page.fair.js +++ b/test_case/login_template/assets/fair/lib_login_login_page.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _LoginPageState(){const inner=_LoginPageState.__inner__;if(this==__global__){return new _LoginPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_LoginPageState.prototype.ctor.apply(this,args);return this;}}_LoginPageState.__inner__=function inner(){};_LoginPageState.prototype={};_LoginPageState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _LoginPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _LoginPageState(){const inner=_LoginPageState.__inner__;if(this==__global__){return new _LoginPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_LoginPageState.prototype.ctor.apply(this,args);return this;}}_LoginPageState.__inner__=function inner(){};_LoginPageState.prototype={};_LoginPageState.prototype.ctor=function(){};;return _LoginPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/login_template/assets/fair/lib_login_login_page.fair.json b/test_case/login_template/assets/fair/lib_login_login_page.fair.json index 05f7c9ab..88a20d16 100644 --- a/test_case/login_template/assets/fair/lib_login_login_page.fair.json +++ b/test_case/login_template/assets/fair/lib_login_login_page.fair.json @@ -361,5 +361,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "68bb715b4cbef80dd730063fd75ed975" } \ No newline at end of file diff --git a/test_case/login_template/build_runner.sh b/test_case/login_template/build_runner.sh new file mode 100644 index 00000000..93af922f --- /dev/null +++ b/test_case/login_template/build_runner.sh @@ -0,0 +1,11 @@ +fvm flutter clean + +echo "----- flutter clean finish -----" + +fvm flutter pub get + +echo "----- flutter pub get finish -----" + +fvm flutter pub run build_runner build --delete-conflicting-outputs + +echo "----- flutter pub run build_runner build finish -----" diff --git a/test_case/login_template/pubspec.lock b/test_case/login_template/pubspec.lock index cca1703b..0425fa14 100644 --- a/test_case/login_template/pubspec.lock +++ b/test_case/login_template/pubspec.lock @@ -5,20 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 url: "https://pub.flutter-io.cn" source: hosted - version: "31.0.0" + version: "54.0.0" analyzer: - dependency: transitive + dependency: "direct overridden" description: name: analyzer + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.0" + version: "5.6.0" archive: dependency: transitive description: name: archive + sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" url: "https://pub.flutter-io.cn" source: hosted version: "3.3.2" @@ -26,6 +29,7 @@ packages: dependency: transitive description: name: args + sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" @@ -33,27 +37,31 @@ packages: dependency: transitive description: name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.2" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build + sha256: "79752d67750874fe7eb6d509a7514237b66eabdb8f6c44295d50083a19d1008e" url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.1.1" build_config: dependency: transitive description: name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" @@ -61,27 +69,31 @@ packages: dependency: transitive description: name: build_daemon + sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "4.0.0" build_resolvers: - dependency: transitive + dependency: "direct overridden" description: name: build_resolvers + sha256: "6c4dd11d05d056e76320b828a1db0fc01ccd376922526f8e9d6c796a5adbac20" url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.6" + version: "2.2.1" build_runner: dependency: "direct dev" description: name: build_runner + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" url: "https://pub.flutter-io.cn" source: hosted version: "7.2.7" @@ -89,6 +101,7 @@ packages: dependency: transitive description: name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" @@ -96,6 +109,7 @@ packages: dependency: transitive description: name: built_value + sha256: "59e08b0079bb75f7e27392498e26339387c1089c6bd58525a14eb8508637277b" url: "https://pub.flutter-io.cn" source: hosted version: "8.4.2" @@ -103,55 +117,47 @@ packages: dependency: transitive description: name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml + sha256: dd007e4fb8270916820a0d66e24f619266b60773cddd082c6439341645af2659 url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.5" clock: dependency: transitive description: name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.1.1" code_builder: dependency: transitive description: name: code_builder + sha256: "02ce3596b459c666530f045ad6f96209474e8fee6e4855940a3cee65fb872ec5" url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" collection: - dependency: transitive + dependency: "direct overridden" description: name: collection + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert + sha256: "1be13198012c1d5bc042dc40ad1d7f16cbd522350984c0c1abf471d6d7e305c6" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" @@ -159,6 +165,7 @@ packages: dependency: transitive description: name: crypto + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" @@ -166,69 +173,76 @@ packages: dependency: "direct main" description: name: cupertino_icons + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.1" + version: "2.2.5" fair: dependency: "direct main" description: path: "../../fair" relative: true source: path - version: "2.8.0" + version: "3.3.0" fair_annotation: dependency: transitive description: name: fair_annotation + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" fair_compiler: dependency: "direct dev" description: - name: fair_compiler - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.4.0" + path: "../../compiler" + relative: true + source: path + version: "1.8.0" fair_dart2dsl: dependency: transitive description: name: fair_dart2dsl + sha256: a4e859678c0dcad711d688c0e82998fde5e75d2f5f5620d9b2c6d7426d22acbd url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.4.0" fair_dart2js: dependency: transitive description: name: fair_dart2js + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_3_0_0" + path: "../../flutter_version/flutter_3_13_0" relative: true source: path - version: "3.0.0+1" + version: "3.13.0" fake_async: dependency: transitive description: name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" @@ -236,6 +250,7 @@ packages: dependency: transitive description: name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" url: "https://pub.flutter-io.cn" source: hosted version: "6.1.4" @@ -243,6 +258,7 @@ packages: dependency: transitive description: name: fixnum + sha256: "04be3e934c52e082558cc9ee21f42f5c1cd7a1262f4c63cd0357c08d5bba81ec" url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" @@ -250,6 +266,7 @@ packages: dependency: transitive description: name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.5" @@ -262,6 +279,7 @@ packages: dependency: "direct dev" description: name: flutter_lints + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" @@ -279,13 +297,15 @@ packages: dependency: transitive description: name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob + sha256: c51b4fdfee4d281f49b8c957f1add91b815473597f76bcf07377987f66a55729 url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" @@ -293,6 +313,7 @@ packages: dependency: transitive description: name: graphs + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" @@ -300,6 +321,7 @@ packages: dependency: transitive description: name: http + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" url: "https://pub.flutter-io.cn" source: hosted version: "0.13.5" @@ -307,6 +329,7 @@ packages: dependency: transitive description: name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" @@ -314,6 +337,7 @@ packages: dependency: transitive description: name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" @@ -321,6 +345,7 @@ packages: dependency: transitive description: name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" url: "https://pub.flutter-io.cn" source: hosted version: "0.17.0" @@ -328,6 +353,7 @@ packages: dependency: transitive description: name: io + sha256: "0d4c73c3653ab85bf696d51a9657604c900a370549196a91f33e4c39af760852" url: "https://pub.flutter-io.cn" source: hosted version: "1.0.3" @@ -335,6 +361,7 @@ packages: dependency: transitive description: name: js + sha256: a5e201311cb08bf3912ebbe9a2be096e182d703f881136ec1e81a2338a9e120d url: "https://pub.flutter-io.cn" source: hosted version: "0.6.4" @@ -342,6 +369,7 @@ packages: dependency: transitive description: name: json_annotation + sha256: "3520fa844009431b5d4491a5a778603520cdc399ab3406332dcc50f93547258c" url: "https://pub.flutter-io.cn" source: hosted version: "4.7.0" @@ -349,6 +377,7 @@ packages: dependency: transitive description: name: lints + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" @@ -356,6 +385,7 @@ packages: dependency: transitive description: name: logging + sha256: c0bbfe94d46aedf9b8b3e695cf3bd48c8e14b35e3b2c639e0aa7755d589ba946 url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" @@ -363,27 +393,31 @@ packages: dependency: transitive description: name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.11" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.4" + version: "0.5.0" meta: dependency: transitive description: name: meta + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.flutter-io.cn" source: hosted - version: "1.7.0" + version: "1.9.1" mime: dependency: transitive description: name: mime + sha256: dab22e92b41aa1255ea90ddc4bc2feaf35544fd0728e209638cad041a6e3928a url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" @@ -391,6 +425,7 @@ packages: dependency: transitive description: name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" @@ -398,13 +433,15 @@ packages: dependency: transitive description: name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.1" + version: "1.8.3" pedantic: dependency: transitive description: name: pedantic + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" @@ -412,6 +449,7 @@ packages: dependency: transitive description: name: platform + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" @@ -419,6 +457,7 @@ packages: dependency: transitive description: name: plugin_platform_interface + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" @@ -426,6 +465,7 @@ packages: dependency: transitive description: name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" @@ -433,6 +473,7 @@ packages: dependency: transitive description: name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" url: "https://pub.flutter-io.cn" source: hosted version: "4.2.4" @@ -440,6 +481,7 @@ packages: dependency: transitive description: name: pub_semver + sha256: b959af0a045c3484c4a8f4997731f5bfe4cac60d732fd8ce35b351f2d6a459fe url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" @@ -447,6 +489,7 @@ packages: dependency: transitive description: name: pubspec_parse + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" @@ -454,6 +497,7 @@ packages: dependency: transitive description: name: shelf + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" @@ -461,6 +505,7 @@ packages: dependency: transitive description: name: shelf_web_socket + sha256: "6db16374bc3497d21aa0eebe674d3db9fdf82082aac0f04dc7b44e4af5b08afc" url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" @@ -470,37 +515,42 @@ packages: source: sdk version: "0.0.99" source_gen: - dependency: transitive + dependency: "direct overridden" description: name: source_gen + sha256: "373f96cf5a8744bc9816c1ff41cf5391bbdbe3d7a96fe98c622b6738a8a7bd33" url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.2" + version: "1.3.2" source_span: dependency: transitive description: name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.flutter-io.cn" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform + sha256: f1d172e22a5432c042b5adfa9aff621372e4292231d9d73ad00f486ad01c2395 url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" @@ -508,27 +558,31 @@ packages: dependency: transitive description: name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.9" + version: "0.6.0" timing: dependency: transitive description: name: timing + sha256: c386d07d7f5efc613479a7c4d9d64b03710b03cfaa7e8ad5f2bfb295a1f0dfad url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" @@ -536,6 +590,7 @@ packages: dependency: transitive description: name: typed_data + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" @@ -543,6 +598,7 @@ packages: dependency: transitive description: name: url_launcher + sha256: "568176fc8ab5ac1d88ff0db8ff28659d103851670dda55e83b485664c2309299" url: "https://pub.flutter-io.cn" source: hosted version: "6.1.6" @@ -550,6 +606,7 @@ packages: dependency: transitive description: name: url_launcher_android + sha256: "2514dc16ac169adf55159268d7bf70317d9f2fc9ef5bb02020bb7ad710c0aeb4" url: "https://pub.flutter-io.cn" source: hosted version: "6.0.21" @@ -557,6 +614,7 @@ packages: dependency: transitive description: name: url_launcher_ios + sha256: "6ba7dddee26c9fae27c9203c424631109d73c8fa26cfa7bc3e35e751cb87f62e" url: "https://pub.flutter-io.cn" source: hosted version: "6.0.17" @@ -564,6 +622,7 @@ packages: dependency: transitive description: name: url_launcher_linux + sha256: "360fa359ab06bcb4f7c5cd3123a2a9a4d3364d4575d27c4b33468bd4497dd094" url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -571,6 +630,7 @@ packages: dependency: transitive description: name: url_launcher_macos + sha256: a9b3ea9043eabfaadfa3fb89de67a11210d85569086d22b3854484beab8b3978 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -578,6 +638,7 @@ packages: dependency: transitive description: name: url_launcher_platform_interface + sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" @@ -585,6 +646,7 @@ packages: dependency: transitive description: name: url_launcher_web + sha256: "5669882643b96bb6d5786637cac727c6e918a790053b09245fd4513b8a07df2a" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.13" @@ -592,6 +654,7 @@ packages: dependency: transitive description: name: url_launcher_windows + sha256: e3c3b16d3104260c10eea3b0e34272aaa57921f83148b0619f74c2eced9b7ef1 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -599,20 +662,31 @@ packages: dependency: transitive description: name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: - dependency: transitive + dependency: "direct overridden" description: name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: name: web_socket_channel + sha256: "3a969ddcc204a3e34e863d204b29c0752716f78b6f9cc8235083208d268a4ccd" url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" @@ -620,9 +694,10 @@ packages: dependency: transitive description: name: yaml + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.10.0" + dart: ">=3.1.0-185.0.dev <4.0.0" + flutter: ">=3.0.0" diff --git a/test_case/login_template/pubspec.yaml b/test_case/login_template/pubspec.yaml index 2856fede..248a3792 100644 --- a/test_case/login_template/pubspec.yaml +++ b/test_case/login_template/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: ">=2.17.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions @@ -48,12 +48,20 @@ dev_dependencies: # rules and activating additional ones. flutter_lints: ^2.0.0 build_runner: ^2.1.2 - fair_compiler: ^1.4.0 + fair_compiler: + path: ../../compiler dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_3_0_0 + path: ../../flutter_version/flutter_3_13_0 + build_runner: 2.4.6 + build_resolvers: 2.2.1 + source_gen: 1.3.2 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test_case/my_app/.gitignore b/test_case/my_app/.gitignore deleted file mode 100644 index 34ef70ae..00000000 --- a/test_case/my_app/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# The .vscode folder contains launch configuration and tasks you configure in -# VS Code which you may wish to be included in version control, so this line -# is commented out by default. -#.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -**/ios/Flutter/.last_build_id -.dart_tool/ -.flutter-plugins -.flutter-plugins-dependencies -.packages -.pub-cache/ -.pub/ -/build/ - -# Web related -lib/generated_plugin_registrant.dart - -# Symbolication related -app.*.symbols - -# Obfuscation related -app.*.map.json -/pubspec.lock diff --git a/test_case/my_app/.metadata b/test_case/my_app/.metadata deleted file mode 100644 index 6bfb0fde..00000000 --- a/test_case/my_app/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: 78910062997c3a836feee883712c241a5fd22983 - channel: unknown - -project_type: app diff --git a/test_case/my_app/README.md b/test_case/my_app/README.md deleted file mode 100644 index 8710a939..00000000 --- a/test_case/my_app/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# my_app - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. diff --git a/test_case/my_app/android/.gitignore b/test_case/my_app/android/.gitignore deleted file mode 100644 index 0a741cb4..00000000 --- a/test_case/my_app/android/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -gradle-wrapper.jar -/.gradle -/captures/ -/gradlew -/gradlew.bat -/local.properties -GeneratedPluginRegistrant.java - -# Remember to never publicly share your keystore. -# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app -key.properties diff --git a/test_case/my_app/android/app/build.gradle b/test_case/my_app/android/app/build.gradle deleted file mode 100644 index 7d03f469..00000000 --- a/test_case/my_app/android/app/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 31 - - sourceSets { - main.java.srcDirs += 'src/main/kotlin' - } - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.my_app" - minSdkVersion 19 - targetSdkVersion 29 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" -} diff --git a/test_case/my_app/android/app/src/debug/AndroidManifest.xml b/test_case/my_app/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 106b2a5e..00000000 --- a/test_case/my_app/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/test_case/my_app/android/app/src/main/AndroidManifest.xml b/test_case/my_app/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 825001cf..00000000 --- a/test_case/my_app/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/test_case/my_app/android/app/src/main/kotlin/com/example/my_app/MainActivity.kt b/test_case/my_app/android/app/src/main/kotlin/com/example/my_app/MainActivity.kt deleted file mode 100644 index bab1d2fa..00000000 --- a/test_case/my_app/android/app/src/main/kotlin/com/example/my_app/MainActivity.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.example.my_app - -import io.flutter.embedding.android.FlutterActivity - -class MainActivity: FlutterActivity() { -} diff --git a/test_case/my_app/android/app/src/main/res/drawable/launch_background.xml b/test_case/my_app/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f8..00000000 --- a/test_case/my_app/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/test_case/my_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/test_case/my_app/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/test_case/my_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/test_case/my_app/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/test_case/my_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/test_case/my_app/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/test_case/my_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/test_case/my_app/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/test_case/my_app/android/app/src/main/res/values/styles.xml b/test_case/my_app/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 1f83a33f..00000000 --- a/test_case/my_app/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/test_case/my_app/android/app/src/profile/AndroidManifest.xml b/test_case/my_app/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 106b2a5e..00000000 --- a/test_case/my_app/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/test_case/my_app/android/build.gradle b/test_case/my_app/android/build.gradle deleted file mode 100644 index 433270e4..00000000 --- a/test_case/my_app/android/build.gradle +++ /dev/null @@ -1,31 +0,0 @@ -buildscript { - ext.kotlin_version = '1.5.31' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:4.0.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/test_case/my_app/android/gradle.properties b/test_case/my_app/android/gradle.properties deleted file mode 100644 index a6738207..00000000 --- a/test_case/my_app/android/gradle.properties +++ /dev/null @@ -1,4 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M -android.useAndroidX=true -android.enableJetifier=true -android.enableR8=true diff --git a/test_case/my_app/android/gradle/wrapper/gradle-wrapper.properties b/test_case/my_app/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 493072b3..00000000 --- a/test_case/my_app/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/test_case/my_app/android/settings.gradle b/test_case/my_app/android/settings.gradle deleted file mode 100644 index 44e62bcf..00000000 --- a/test_case/my_app/android/settings.gradle +++ /dev/null @@ -1,11 +0,0 @@ -include ':app' - -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/test_case/my_app/assets/bundle/lib_home_page.fair.js b/test_case/my_app/assets/bundle/lib_home_page.fair.js deleted file mode 100644 index 00b0ef61..00000000 --- a/test_case/my_app/assets/bundle/lib_home_page.fair.js +++ /dev/null @@ -1 +0,0 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;function _MyHomePageState(){const inner=_MyHomePageState.__inner__;if(this==__global__){return new _MyHomePageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MyHomePageState.prototype.ctor.apply(this,args);return this;}}_MyHomePageState.__inner__=function inner(){this._counter=0;};_MyHomePageState.prototype={_incrementCounter:function _incrementCounter(){const __thiz__=this;with(__thiz__){_counter=_counter+1;setState('#FairKey#',function dummy(){});}},};_MyHomePageState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _MyHomePageState();})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); diff --git a/test_case/my_app/assets/bundle/lib_home_page.fair.json b/test_case/my_app/assets/bundle/lib_home_page.fair.json deleted file mode 100644 index ef5e8260..00000000 --- a/test_case/my_app/assets/bundle/lib_home_page.fair.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "className": "Scaffold", - "na": { - "appBar": { - "className": "AppBar", - "na": { - "title": { - "className": "Text", - "pa": [ - "#(widget.title)" - ] - } - } - }, - "body": { - "className": "Center", - "na": { - "child": { - "className": "Column", - "na": { - "mainAxisAlignment": "#(MainAxisAlignment.center)", - "children": [ - { - "className": "Text", - "pa": [ - "You have pushed the button this many times:" - ], - "na": { - "style": { - "className": "TextStyle", - "na": { - "fontSize": 16, - "color": "#(Colors.black)" - } - } - } - }, - { - "className": "Text", - "pa": [ - "#($_counter)" - ], - "na": { - "style": { - "className": "ThemeStyle.headline4", - "pa": [ - "^(context)" - ] - } - } - }, - { - "className": "RotateAnimatedTextKit", - "na": { - "text": [ - "AWESOME", - "OPTIMISTIC", - "DIFFERENT" - ], - "textStyle": { - "className": "TextStyle", - "na": { - "fontSize": 40.0, - "fontFamily": "Horizon" - } - }, - "textAlign": "#(TextAlign.start)", - "isRepeatingAnimation": true, - "alignment": "#(Alignment.centerRight)" - } - } - ] - } - } - } - }, - "floatingActionButton": { - "className": "FloatingActionButton", - "na": { - "onPressed": "@(_incrementCounter)", - "tooltip": "Increment", - "child": { - "className": "Icon", - "pa": [ - "#(Icons.add)" - ] - } - } - } - }, - "methodMap": {} -} \ No newline at end of file diff --git a/test_case/my_app/ios/.gitignore b/test_case/my_app/ios/.gitignore deleted file mode 100644 index e96ef602..00000000 --- a/test_case/my_app/ios/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -*.mode1v3 -*.mode2v3 -*.moved-aside -*.pbxuser -*.perspectivev3 -**/*sync/ -.sconsign.dblite -.tags* -**/.vagrant/ -**/DerivedData/ -Icon? -**/Pods/ -**/.symlinks/ -profile -xcuserdata -**/.generated/ -Flutter/App.framework -Flutter/Flutter.framework -Flutter/Flutter.podspec -Flutter/Generated.xcconfig -Flutter/app.flx -Flutter/app.zip -Flutter/flutter_assets/ -Flutter/flutter_export_environment.sh -ServiceDefinitions.json -Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!default.mode1v3 -!default.mode2v3 -!default.pbxuser -!default.perspectivev3 diff --git a/test_case/my_app/ios/Flutter/AppFrameworkInfo.plist b/test_case/my_app/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 4f8d4d24..00000000 --- a/test_case/my_app/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 11.0 - - diff --git a/test_case/my_app/ios/Flutter/Debug.xcconfig b/test_case/my_app/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba11..00000000 --- a/test_case/my_app/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/test_case/my_app/ios/Flutter/Release.xcconfig b/test_case/my_app/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e9340..00000000 --- a/test_case/my_app/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/test_case/my_app/ios/Podfile b/test_case/my_app/ios/Podfile deleted file mode 100644 index 88359b22..00000000 --- a/test_case/my_app/ios/Podfile +++ /dev/null @@ -1,41 +0,0 @@ -# Uncomment this line to define a global platform for your project -# platform :ios, '11.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def flutter_root - generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) - unless File.exist?(generated_xcode_build_settings_path) - raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - - File.foreach(generated_xcode_build_settings_path) do |line| - matches = line.match(/FLUTTER_ROOT\=(.*)/) - return matches[1].strip if matches - end - raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" -end - -require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) - -flutter_ios_podfile_setup - -target 'Runner' do - use_frameworks! - use_modular_headers! - - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - flutter_additional_ios_build_settings(target) - end -end diff --git a/test_case/my_app/ios/Podfile.lock b/test_case/my_app/ios/Podfile.lock deleted file mode 100644 index 71e087fb..00000000 --- a/test_case/my_app/ios/Podfile.lock +++ /dev/null @@ -1,28 +0,0 @@ -PODS: - - fair (0.0.1): - - Flutter - - Flutter (1.0.0) - - url_launcher_ios (0.0.1): - - Flutter - -DEPENDENCIES: - - fair (from `.symlinks/plugins/fair/ios`) - - Flutter (from `Flutter`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - -EXTERNAL SOURCES: - fair: - :path: ".symlinks/plugins/fair/ios" - Flutter: - :path: Flutter - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - -SPEC CHECKSUMS: - fair: a2ad8650ee4df9e6bcc51426213b3a3561dbacb8 - Flutter: 405776dd0763d7e32a8f989d4e271ca1317d080c - url_launcher_ios: 02f1989d4e14e998335b02b67a7590fa34f971af - -PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 - -COCOAPODS: 1.11.3 diff --git a/test_case/my_app/ios/Runner.xcodeproj/project.pbxproj b/test_case/my_app/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 60ad9dbb..00000000 --- a/test_case/my_app/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,576 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 15112253EAF3294EA7BD2B1A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6DC9F9ABE7AC711D7CED3EEB /* Pods_Runner.framework */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 11959A3B0FC9F6890989A5FE /* 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 = ""; }; - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4307AB1A5580A88915B73CFE /* 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 = ""; }; - 48FBA0E3FF065579C34E7241 /* 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 = ""; }; - 6DC9F9ABE7AC711D7CED3EEB /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 15112253EAF3294EA7BD2B1A /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9682F18B4C66C7EBD2D391DE /* Frameworks */ = { - isa = PBXGroup; - children = ( - 6DC9F9ABE7AC711D7CED3EEB /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - A9D143AE63AE857293AEEB89 /* Pods */, - 9682F18B4C66C7EBD2D391DE /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - A9D143AE63AE857293AEEB89 /* Pods */ = { - isa = PBXGroup; - children = ( - 48FBA0E3FF065579C34E7241 /* Pods-Runner.debug.xcconfig */, - 11959A3B0FC9F6890989A5FE /* Pods-Runner.release.xcconfig */, - 4307AB1A5580A88915B73CFE /* Pods-Runner.profile.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 8E099D628D85277A57211A2B /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 470E8C5C78E8096965D79A8D /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1300; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 1100; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 470E8C5C78E8096965D79A8D /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 8E099D628D85277A57211A2B /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 33SWE96Z9N; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myApp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 33SWE96Z9N; - ENABLE_BITCODE = NO; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myApp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = 33SWE96Z9N; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myApp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 919434a6..00000000 --- a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/test_case/my_app/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/test_case/my_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/test_case/my_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 3db53b6e..00000000 --- a/test_case/my_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test_case/my_app/ios/Runner.xcworkspace/contents.xcworkspacedata b/test_case/my_app/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/test_case/my_app/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/test_case/my_app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/test_case/my_app/ios/Runner/AppDelegate.swift b/test_case/my_app/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a..00000000 --- a/test_case/my_app/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fab..00000000 --- a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 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 diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/test_case/my_app/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725b..00000000 --- a/test_case/my_app/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/test_case/my_app/ios/Runner/Base.lproj/LaunchScreen.storyboard b/test_case/my_app/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c7..00000000 --- a/test_case/my_app/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test_case/my_app/ios/Runner/Base.lproj/Main.storyboard b/test_case/my_app/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c28516..00000000 --- a/test_case/my_app/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test_case/my_app/ios/Runner/Info.plist b/test_case/my_app/ios/Runner/Info.plist deleted file mode 100644 index f982a914..00000000 --- a/test_case/my_app/ios/Runner/Info.plist +++ /dev/null @@ -1,47 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - my_app - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - CADisableMinimumFrameDurationOnPhone - - - diff --git a/test_case/my_app/ios/Runner/Runner-Bridging-Header.h b/test_case/my_app/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a56..00000000 --- a/test_case/my_app/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/test_case/my_app/lib/custom.dart b/test_case/my_app/lib/custom.dart deleted file mode 100644 index 9204aadb..00000000 --- a/test_case/my_app/lib/custom.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -class CustomWidget extends StatelessWidget{ - @override - Widget build(BuildContext context) { - return Container( - - ); - } - -} \ No newline at end of file diff --git a/test_case/my_app/lib/delegate.dart b/test_case/my_app/lib/delegate.dart deleted file mode 100644 index f3736f9e..00000000 --- a/test_case/my_app/lib/delegate.dart +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2005-present, 58.com. All rights reserved. - * Use of this source code is governed by a BSD type license that can be - * found in the LICENSE file. - */ - -import 'dart:ui'; - -import 'package:fair/fair.dart'; - -import 'theme.dart'; - -class MyHomePageDelegate extends FairDelegate { - int _counter = 0; - bool _check = false; - - void _incrementCounter() { - setState(() { - _counter++; - }); - } - - - @override - Map bindValue() { - var value = super.bindValue(); - value['_counter'] = () => _counter; - value['_color'] = () => const Color(0xffff0000); - value['_check']= () => _check; - return value; - } - - @override - Map bindFunction() { - var fun = super.bindFunction(); - fun['_incrementCounter'] = _incrementCounter; - fun['ThemeStyle.headline4'] = (props) => ThemeStyle.headline4(context); - //fun['AJKColors.ajkPrimaryColor'] = () => AJKColors.ajkPrimaryColor; - return fun; - } -} diff --git a/test_case/my_app/lib/home_page.dart b/test_case/my_app/lib/home_page.dart deleted file mode 100644 index cb74bb03..00000000 --- a/test_case/my_app/lib/home_page.dart +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2005-present, 58.com. All rights reserved. - * Use of this source code is governed by a BSD type license that can be - * found in the LICENSE file. - */ -import 'package:fair/fair.dart'; -import 'package:flutter/material.dart'; -import 'package:animated_text_kit/src/rotate.dart'; - -import 'theme.dart'; -@FairPatch() -class MyHomePage extends StatefulWidget { - MyHomePage({Key key, this.title}) : super(key: key); - final String title; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - _counter= _counter+1; - setState(() { - - }); - - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'You have pushed the button this many times:', - style: TextStyle(fontSize: 16, color: Colors.black), - - ), - Text( - '$_counter', - style: ThemeStyle.headline4(context), - - ), - RotateAnimatedTextKit( - text: ["AWESOME", "OPTIMISTIC", "DIFFERENT"], - textStyle: TextStyle(fontSize: 40.0, fontFamily: "Horizon"), - textAlign: TextAlign.start, - isRepeatingAnimation: true, - alignment: Alignment.centerRight - // or Alignment.topLeft ) - ) - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: Icon(Icons.add), - ), - ); - } - - -} diff --git a/test_case/my_app/lib/main.dart b/test_case/my_app/lib/main.dart deleted file mode 100644 index 53f1a72c..00000000 --- a/test_case/my_app/lib/main.dart +++ /dev/null @@ -1,43 +0,0 @@ -import 'package:fair/fair.dart'; -import 'package:flutter/material.dart'; -import 'package:my_app/src/generated.fair.dart'; - -import 'delegate.dart'; - -@FairBinding(packages: ['package:animated_text_kit/src/rotate.dart']) -void main() { - WidgetsFlutterBinding.ensureInitialized(); - FairApp.runApplication( - _getApp(), - plugins: { - - }); -} - -dynamic _getApp() => FairApp( - child: MyApp(), - delegate: { - 'home_page': (_, data) => MyHomePageDelegate(), - }, - generated: AppGeneratedModule(), - ); - -class MyApp extends StatelessWidget { - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData( - primarySwatch: Colors.blue, - visualDensity: VisualDensity.adaptivePlatformDensity, - ), - home: FairWidget( - name: 'home_page', - path: 'assets/bundle/lib_home_page.fair.json', - data: { - 'title': 'Flutter Demo Home Page', - }, - ) /*MyHomePage(title: 'Flutter Demo Home Page')*/, - ); - } -} diff --git a/test_case/my_app/lib/src/generated.fair.dart b/test_case/my_app/lib/src/generated.fair.dart deleted file mode 100644 index 526a3e32..00000000 --- a/test_case/my_app/lib/src/generated.fair.dart +++ /dev/null @@ -1,59 +0,0 @@ -// Generated by Fair on 2021-08-05 17:26:53.525113. -import 'package:animated_text_kit/src/rotate.dart'; - -import 'package:flutter/material.dart'; -import 'package:fair/fair.dart'; -import 'package:fair_version/fair_version.dart'; - -class AppGeneratedModule extends GeneratedModule { - @override - Map components() { - return { - 'RotateAnimatedTextKit': (props) => RotateAnimatedTextKit( - key: props['key'], - text: List.from(props['text']), - textAlign: props['textAlign'] ?? TextAlign.start, - textStyle: props['textStyle'], - transitionHeight: props['transitionHeight']?.toDouble(), - alignment: props['alignment'] ?? Alignment.center, - textDirection: props['textDirection'] ?? TextDirection.ltr, - duration: props['duration'] ?? const Duration(milliseconds: 2000), - pause: props['pause'] ?? const Duration(milliseconds: 500), - onTap: props['onTap'], - onNext: props['onNext'], - onNextBeforePause: props['onNextBeforePause'], - onFinished: props['onFinished'], - isRepeatingAnimation: props['isRepeatingAnimation'] ?? true, - totalRepeatCount: props['totalRepeatCount'] ?? 3, - repeatForever: props['repeatForever'] ?? false, - displayFullTextOnTap: props['displayFullTextOnTap'] ?? false, - stopPauseOnTap: props['stopPauseOnTap'] ?? false, - ), - 'RotateAnimatedTextKit#onTap': (props) => () { - return (props['block']); - }, - 'RotateAnimatedTextKit#onNext': (props) => ( - int, - bool, - ) { - return (props['block']) as dynamic; - }, - 'RotateAnimatedTextKit#onNextBeforePause': (props) => ( - int, - bool, - ) { - return (props['block']); - }, - 'RotateAnimatedTextKit#onFinished': (props) => () { - return (props['block']); - }, - }; - } - - @override - Map mapping() { - return const { - 'RotateAnimatedTextKit': true, - }; - } -} diff --git a/test_case/my_app/lib/theme.dart b/test_case/my_app/lib/theme.dart deleted file mode 100644 index 6eae7b91..00000000 --- a/test_case/my_app/lib/theme.dart +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (C) 2005-present, 58.com. All rights reserved. - * Use of this source code is governed by a BSD type license that can be - * found in the LICENSE file. - */ - -import 'package:fair/fair.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/painting.dart'; -import 'package:flutter/widgets.dart'; - -class ThemeStyle { - static TextStyle headline4(BuildContext context) => - Theme.of(context).textTheme.headline4; -} diff --git a/test_case/my_app/pubspec.yaml b/test_case/my_app/pubspec.yaml deleted file mode 100644 index 90e6eddc..00000000 --- a/test_case/my_app/pubspec.yaml +++ /dev/null @@ -1,88 +0,0 @@ -name: my_app -description: A new Flutter project. - -# The following line prevents the package from being accidentally published to -# pub.dev using `pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 1.0.0+1 - -environment: - sdk: ">=2.7.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - - fair: - path: ../../fair - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.0 - -dev_dependencies: - flutter_test: - sdk: flutter - build_runner: ^2.0.0 - animated_text_kit: 3.0.1 - fair_compiler: - path: ../../compiler - -# Switch to another stable flutter version -dependency_overrides: - fair_version: - path: ../../flutter_version/flutter_3_0_0 -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - assets: - - assets/bundle/ - - assets/ - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware. - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test_case/my_app/test/widget_test.dart b/test_case/my_app/test/widget_test.dart deleted file mode 100644 index b1bb0f15..00000000 --- a/test_case/my_app/test/widget_test.dart +++ /dev/null @@ -1,30 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:my_app/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} diff --git a/test_case/my_app/web/favicon.png b/test_case/my_app/web/favicon.png deleted file mode 100644 index 8aaa46ac1ae21512746f852a42ba87e4165dfdd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM diff --git a/test_case/my_app/web/icons/Icon-192.png b/test_case/my_app/web/icons/Icon-192.png deleted file mode 100644 index b749bfef07473333cf1dd31e9eed89862a5d52aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5292 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 diff --git a/test_case/my_app/web/icons/Icon-512.png b/test_case/my_app/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48dff1169879ba46840804b412fe02fefd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8252 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 diff --git a/test_case/my_app/web/index.html b/test_case/my_app/web/index.html deleted file mode 100644 index d6c0e241..00000000 --- a/test_case/my_app/web/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - my_app - - - - - - - - diff --git a/test_case/my_app/web/manifest.json b/test_case/my_app/web/manifest.json deleted file mode 100644 index ba3a24cb..00000000 --- a/test_case/my_app/web/manifest.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "my_app", - "short_name": "my_app", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - } - ] -} diff --git a/test_case/sugar_demo/android/app/build.gradle b/test_case/sugar_demo/android/app/build.gradle index c0365f7d..9b3d931d 100644 --- a/test_case/sugar_demo/android/app/build.gradle +++ b/test_case/sugar_demo/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 30 + compileSdkVersion 33 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -44,8 +44,8 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.sugar_demo" - minSdkVersion 16 - targetSdkVersion 30 + minSdkVersion 20 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/test_case/sugar_demo/android/app/src/main/AndroidManifest.xml b/test_case/sugar_demo/android/app/src/main/AndroidManifest.xml index 3ae06842..39421745 100644 --- a/test_case/sugar_demo/android/app/src/main/AndroidManifest.xml +++ b/test_case/sugar_demo/android/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ android:icon="@mipmap/ic_launcher"> 0?arguments[0].__args__||arguments:[];inner.apply(this,args);_SugarElseIfPageState.prototype.ctor.apply(this,args);return this;}}_SugarElseIfPageState.__inner__=function inner(){this.fairProps=__initProps__;this._value=2;};_SugarElseIfPageState.prototype={logAction:function logAction(){const __thiz__=this;with(__thiz__){print('Click......');}},};_SugarElseIfPageState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _SugarElseIfPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _SugarElseIfPageState(){const inner=_SugarElseIfPageState.__inner__;if(this==__global__){return new _SugarElseIfPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_SugarElseIfPageState.prototype.ctor.apply(this,args);return this;}}_SugarElseIfPageState.__inner__=function inner(){this.fairProps=__initProps__;this._value=2;};_SugarElseIfPageState.prototype={logAction:function logAction(){const __thiz__=this;with(__thiz__){print('Click......');}},_getItemCount:function _getItemCount(){const __thiz__=this;with(__thiz__){return _value;}},getValueOrEmpty:function getValueOrEmpty(val,defaultVal){const __thiz__=this;const __arg_ctx__={val,defaultVal,};with(__thiz__){with(__arg_ctx__){if(val==null){return defaultVal;}return val.toString();}}},};_SugarElseIfPageState.prototype.ctor=function(){};;return _SugarElseIfPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/sugar_demo/assets/bundle/lib_sugar_elseif_test_page.fair.json b/test_case/sugar_demo/assets/bundle/lib_sugar_elseif_test_page.fair.json index 3d2d0e50..0e2a70b9 100644 --- a/test_case/sugar_demo/assets/bundle/lib_sugar_elseif_test_page.fair.json +++ b/test_case/sugar_demo/assets/bundle/lib_sugar_elseif_test_page.fair.json @@ -60,13 +60,13 @@ { "className": "Text", "pa": [ - "$(item.name)" + "%(getValueOrEmpty($(item.name),))" ] }, { "className": "Text", "pa": [ - "#(${item.age})" + "%(getValueOrEmpty($(item.age),18))" ] } ] @@ -74,6 +74,12 @@ } } } + }, + "functionParameters": { + "pa": [ + "index", + "item" + ] } } ] @@ -153,6 +159,52 @@ } } }, + { + "className": "SizedBox", + "na": { + "width": { + "className": "Sugar.width", + "pa": [ + "^(context)" + ] + }, + "height": { + "className": "Sugar.height", + "pa": [ + "^(context)" + ] + }, + "child": { + "className": "Sugar.listBuilder", + "na": { + "itemCount": "%(_getItemCount)", + "itemBuilder": { + "className": "Center", + "na": { + "child": { + "className": "Container", + "na": { + "height": 20, + "child": { + "className": "Text", + "pa": [ + "#($item)" + ] + } + } + } + }, + "functionParameters": { + "pa": [ + "context", + "item" + ] + } + } + } + } + } + }, { "className": "FloatingActionButton", "na": { @@ -243,6 +295,12 @@ } } } + }, + "functionParameters": { + "pa": [ + "context", + "item" + ] } } } @@ -333,6 +391,12 @@ } } } + }, + "functionParameters": { + "pa": [ + "content", + "index" + ] } }, "childCount": 3 @@ -366,6 +430,12 @@ "#(是 grid item $index 啊~~)" ] } + }, + "functionParameters": { + "pa": [ + "context", + "index" + ] } }, "childCount": 20 @@ -382,5 +452,10 @@ } } }, - "methodMap": {} + "methodMap": { + "getValueOrEmpty": { + "className": "val.toString" + } + }, + "digest": "c80a906c739b353dde7f3a46b1fba24e" } \ No newline at end of file diff --git a/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.js b/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.js index 0e171805..de76feaf 100644 --- a/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.js +++ b/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function PopupMenuState(){const inner=PopupMenuState.__inner__;if(this==__global__){return new PopupMenuState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);PopupMenuState.prototype.ctor.apply(this,args);return this;}}PopupMenuState.__inner__=function inner(){this._selectedMenu='';};PopupMenuState.prototype={_onSelected:function _onSelected(item){const __thiz__=this;const __arg_ctx__={item,};with(__thiz__){with(__arg_ctx__){setState('#FairKey#',()=>_selectedMenu=item);}}},};PopupMenuState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return PopupMenuState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function PopupMenuState(){const inner=PopupMenuState.__inner__;if(this==__global__){return new PopupMenuState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);PopupMenuState.prototype.ctor.apply(this,args);return this;}}PopupMenuState.__inner__=function inner(){this._selectedMenu='';};PopupMenuState.prototype={_onSelected:function _onSelected(item){const __thiz__=this;const __arg_ctx__={item,};with(__thiz__){with(__arg_ctx__){setState('#FairKey#',()=>_selectedMenu=item);}}},};PopupMenuState.prototype.ctor=function(){};;return PopupMenuState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.json b/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.json index ba293e42..6ad57dba 100644 --- a/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.json +++ b/test_case/sugar_demo/assets/bundle/lib_sugar_menu.fair.json @@ -76,5 +76,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "7d4f16e4302e0b7332c75a367ac9be28" } \ No newline at end of file diff --git a/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.js b/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.js index 38727337..bc03891d 100644 --- a/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.js +++ b/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _WrapState(){const inner=_WrapState.__inner__;if(this==__global__){return new _WrapState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_WrapState.prototype.ctor.apply(this,args);return this;}}_WrapState.__inner__=function inner(){};_WrapState.prototype={};_WrapState.prototype.ctor=function(){Object.prototype.ctor.call(this);};;return _WrapState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _WrapState(){const inner=_WrapState.__inner__;if(this==__global__){return new _WrapState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_WrapState.prototype.ctor.apply(this,args);return this;}}_WrapState.__inner__=function inner(){};_WrapState.prototype={};_WrapState.prototype.ctor=function(){};;return _WrapState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.json b/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.json index 7348aec8..017484b4 100644 --- a/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.json +++ b/test_case/sugar_demo/assets/bundle/lib_warp_demo.fair.json @@ -124,5 +124,6 @@ } } }, - "methodMap": {} + "methodMap": {}, + "digest": "f2f8e4ab3ade30f11345c173b964f84a" } \ No newline at end of file diff --git a/test_case/sugar_demo/build_runner.sh b/test_case/sugar_demo/build_runner.sh new file mode 100644 index 00000000..93af922f --- /dev/null +++ b/test_case/sugar_demo/build_runner.sh @@ -0,0 +1,11 @@ +fvm flutter clean + +echo "----- flutter clean finish -----" + +fvm flutter pub get + +echo "----- flutter pub get finish -----" + +fvm flutter pub run build_runner build --delete-conflicting-outputs + +echo "----- flutter pub run build_runner build finish -----" diff --git a/test_case/sugar_demo/lib/main.dart b/test_case/sugar_demo/lib/main.dart index 7996d644..516e3bb8 100644 --- a/test_case/sugar_demo/lib/main.dart +++ b/test_case/sugar_demo/lib/main.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:fair/fair.dart'; import 'package:flutter/material.dart'; -import 'package:sugar_demo/sugar_elseif_test_page.dart'; import 'person.dart'; void main() { @@ -39,7 +38,6 @@ FairApp getApp() => FairApp( child: MaterialApp( color: Colors.blue, home: - // SugarElseIfPage(fairProps: json.encode({'value':1}),) FairWidget( name: 'DynamicWidget', path: 'assets/bundle/lib_sugar_elseif_test_page.fair.json', diff --git a/test_case/sugar_demo/lib/sugar_elseif_test_page.dart b/test_case/sugar_demo/lib/sugar_elseif_test_page.dart index 7b7e01d4..7a733fa9 100644 --- a/test_case/sugar_demo/lib/sugar_elseif_test_page.dart +++ b/test_case/sugar_demo/lib/sugar_elseif_test_page.dart @@ -23,16 +23,18 @@ class _SugarElseIfPageState extends State { print('Click......'); } - - int _getItemCount() { return _value; } - // List li = ['kk','ddd','dddd']; - + String getValueOrEmpty(dynamic val, String defaultVal) { + if(val == null){ + return defaultVal; + } + return val.toString(); + } @override Widget build(BuildContext context) { @@ -41,20 +43,17 @@ class _SugarElseIfPageState extends State { body: Column( children: [ Column( - children: Sugar.mapEach([ - Person(name: "kk", age: 18, wei: 99), - Person(name: "mm", age: 14, wei: 88) - ], (index, Person item) { + children: Sugar.mapEach([Person(name: "kk", age: 18, wei: 99), Person(name: "mm", age: 14, wei: 88)], (index, Person item) { return Container( height: 50, width: Sugar.width(context), child: Center( child: Row( - children: [ - Text(item.name), - Text("${item.age}"), - ], - ))); + children: [ + Text(getValueOrEmpty(item.name, '')), + Text(getValueOrEmpty(item.age, '18')), + ], + ))); }), ), Container( @@ -65,42 +64,35 @@ class _SugarElseIfPageState extends State { child: Sugar.switchCase( _value, [ - SugarSwitchCaseObj( - reValue: Text("2-ValueTitle"), sugarCase: 2), - SugarSwitchCaseObj( - reValue: Text("3-ValueTitle"), sugarCase: 3), - SugarSwitchCaseObj( - reValue: Text("4-ValueTitle"), sugarCase: 4) + SugarSwitchCaseObj(reValue: () => Text("2-ValueTitle"), sugarCase: () => 2), + SugarSwitchCaseObj(reValue: () => Text("3-ValueTitle"), sugarCase: () => 3), + SugarSwitchCaseObj(reValue: () => Text("4-ValueTitle"), sugarCase: () => 4) ], - Text("default-ValueTitle")), + () => Text("default-ValueTitle")), )), - - SizedBox( - width: Sugar.width(context), - height: Sugar.height(context), - child: Sugar.listBuilder( - itemCount: _getItemCount(), - itemBuilder: (BuildContext context, int item) { - Center( - child: Container( - height: 20, - child: Text("$item"), - ), - ); - }), - - + width: Sugar.width(context), + height: Sugar.height(context), + child: Sugar.listBuilder( + itemCount: _getItemCount(), + itemBuilder: (BuildContext context, int item) { + return Center( + child: Container( + height: 20, + child: Text("$item"), + ), + ); + })), FloatingActionButton( child: Text( Sugar.switchCase( _value, [ - SugarSwitchCaseObj(reValue: "2", sugarCase: 2), - SugarSwitchCaseObj(reValue: "3", sugarCase: 3), - SugarSwitchCaseObj(reValue: "4", sugarCase: 4) + SugarSwitchCaseObj(reValue: () => "2", sugarCase: () => 2), + SugarSwitchCaseObj(reValue: () => "3", sugarCase: () => 3), + SugarSwitchCaseObj(reValue: () => "4", sugarCase: () => 4) ], - "defaultValue"), + () => "defaultValue"), // style: TextStyle(fontWeight: FontWeight.w100), ), onPressed: logAction, @@ -132,7 +124,7 @@ class _SugarElseIfPageState extends State { height: 40, width: Sugar.width(context), child: Container( - margin: EdgeInsets.only(left:0,right: 1, top: 10), + margin: EdgeInsets.only(left: 0, right: 1, top: 10), color: Colors.green, child: Center(child: Text("CustomScrollView-Sugar")), ), @@ -143,20 +135,20 @@ class _SugarElseIfPageState extends State { child: CustomScrollView( slivers: [ SliverList( - delegate: Sugar.sliverChildBuilderDelegate(builder:(content, index){ - return Container( - margin: EdgeInsets.only(top: 10), - height: 85, - alignment: Alignment.center, - color: - Colors.blue, - child: Text( - '$index', - style: const TextStyle( - color: Colors.white, fontSize: 20), - ), - ); - }, childCount: 3,//findChildIndexCallback + delegate: Sugar.sliverChildBuilderDelegate( + builder: (content, index) { + return Container( + margin: EdgeInsets.only(top: 10), + height: 85, + alignment: Alignment.center, + color: Colors.blue, + child: Text( + '$index', + style: const TextStyle(color: Colors.white, fontSize: 20), + ), + ); + }, + childCount: 3, //findChildIndexCallback ), ), SliverGrid( @@ -167,15 +159,15 @@ class _SugarElseIfPageState extends State { crossAxisSpacing: 10.0, childAspectRatio: 4.0, ), - delegate: Sugar.sliverChildBuilderDelegate(builder: - (context, index) { - //创建子widget - return Container( - alignment: Alignment.center, - color: Colors.deepOrange, - child: Text('是 grid item $index 啊~~'), - ); - }, + delegate: Sugar.sliverChildBuilderDelegate( + builder: (context, index) { + //创建子widget + return Container( + alignment: Alignment.center, + color: Colors.deepOrange, + child: Text('是 grid item $index 啊~~'), + ); + }, childCount: 20, ), ), diff --git a/test_case/sugar_demo/pubspec.lock b/test_case/sugar_demo/pubspec.lock index 1165ea6a..66397f3e 100644 --- a/test_case/sugar_demo/pubspec.lock +++ b/test_case/sugar_demo/pubspec.lock @@ -5,182 +5,199 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - url: "https://pub.dartlang.org" + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 + url: "https://pub.flutter-io.cn" source: hosted - version: "31.0.0" + version: "54.0.0" analyzer: - dependency: transitive + dependency: "direct overridden" description: name: analyzer - url: "https://pub.dartlang.org" + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.0" + version: "5.6.0" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.3.2" + version: "3.4.6" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.4.2" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.9.0" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build - url: "https://pub.dartlang.org" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.1" + version: "2.4.1" build_config: dependency: transitive description: name: build_config - url: "https://pub.dartlang.org" + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - url: "https://pub.dartlang.org" + sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "4.0.0" build_resolvers: dependency: transitive description: name: build_resolvers - url: "https://pub.dartlang.org" + sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.6" + version: "2.4.1" build_runner: dependency: "direct dev" description: name: build_runner - url: "https://pub.dartlang.org" + sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.6" build_runner_core: dependency: transitive description: name: build_runner_core - url: "https://pub.dartlang.org" + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.flutter-io.cn" source: hosted - version: "7.2.7" + version: "7.2.11" built_collection: dependency: transitive description: name: built_collection - url: "https://pub.dartlang.org" + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - url: "https://pub.dartlang.org" + sha256: "723b4021e903217dfc445ec4cf5b42e27975aece1fc4ebbc1ca6329c2d9fb54e" + url: "https://pub.flutter-io.cn" source: hosted - version: "8.4.2" + version: "8.7.0" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.dartlang.org" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.5" + version: "2.0.3" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - url: "https://pub.dartlang.org" + sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.3.0" + version: "4.7.0" collection: - dependency: transitive + dependency: "direct overridden" description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.2" + version: "3.0.3" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.5" + version: "1.0.6" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style - url: "https://pub.dartlang.org" + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.1" + version: "2.2.5" fair: dependency: "direct main" description: path: "../../fair" relative: true source: path - version: "2.8.0" + version: "3.3.0" fair_annotation: dependency: transitive description: name: fair_annotation - url: "https://pub.dartlang.org" + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" fair_compiler: @@ -189,61 +206,68 @@ packages: path: "../../compiler" relative: true source: path - version: "1.3.0" + version: "1.8.0" fair_dart2dsl: dependency: transitive description: name: fair_dart2dsl - url: "https://pub.dartlang.org" + sha256: a4e859678c0dcad711d688c0e82998fde5e75d2f5f5620d9b2c6d7426d22acbd + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.4.0" fair_dart2js: dependency: transitive description: name: fair_dart2js - url: "https://pub.dartlang.org" + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_2_5_0" + path: "../../flutter_version/flutter_3_13_0" relative: true source: path - version: "2.5.0+1" + version: "3.13.0" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.4" fixnum: dependency: transitive description: name: fixnum - url: "https://pub.dartlang.org" + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.1" + version: "1.1.0" flat_buffers: dependency: transitive description: name: flat_buffers - url: "https://pub.dartlang.org" + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.5" flutter: @@ -265,184 +289,218 @@ packages: dependency: transitive description: name: frontend_server_client - url: "https://pub.dartlang.org" + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.3" + version: "3.2.0" glob: dependency: transitive description: name: glob - url: "https://pub.dartlang.org" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.3.1" http: dependency: transitive description: name: http - url: "https://pub.dartlang.org" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.13.5" + version: "0.13.6" http_multi_server: dependency: transitive description: name: http_multi_server - url: "https://pub.dartlang.org" + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" intl: dependency: "direct dev" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.flutter-io.cn" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - url: "https://pub.dartlang.org" + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.3" + version: "1.0.4" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.flutter-io.cn" source: hosted - version: "0.6.4" + version: "0.6.7" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.flutter-io.cn" source: hosted - version: "4.7.0" + version: "4.8.1" logging: dependency: transitive description: name: logging - url: "https://pub.dartlang.org" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.2.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.12" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.5" + version: "0.5.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.0.4" package_config: dependency: transitive description: name: package_config - url: "https://pub.dartlang.org" + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.8.3" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.0" + version: "3.1.3" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.6" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.3" + version: "3.7.3" pool: dependency: transitive description: name: pool - url: "https://pub.dartlang.org" + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.flutter-io.cn" source: hosted version: "4.2.4" pub_semver: dependency: transitive description: name: pub_semver - url: "https://pub.dartlang.org" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - url: "https://pub.dartlang.org" + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.1" + version: "1.2.3" shelf: dependency: transitive description: name: shelf - url: "https://pub.dartlang.org" + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - url: "https://pub.dartlang.org" + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.0.4" sky_engine: dependency: transitive description: flutter @@ -452,156 +510,186 @@ packages: dependency: transitive description: name: source_gen - url: "https://pub.dartlang.org" + sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.2" + version: "1.4.0" source_span: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.9.0" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.flutter-io.cn" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - url: "https://pub.dartlang.org" + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.1" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.1" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.12" + version: "0.6.0" timing: dependency: transitive description: name: timing - url: "https://pub.dartlang.org" + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.0" + version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.1" + version: "1.3.2" url_launcher: dependency: transitive description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.6" + version: "6.2.1" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.21" + version: "6.2.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.17" + version: "6.2.0" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.1" + version: "2.2.0" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.0.13" + version: "2.2.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.1.0" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: - dependency: transitive + dependency: "direct overridden" description: name: watcher - url: "https://pub.dartlang.org" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: name: web_socket_channel - url: "https://pub.dartlang.org" + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.0" + version: "2.4.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=2.18.0 <3.0.0" - flutter: ">=2.10.0" + dart: ">=3.1.0 <4.0.0" + flutter: ">=3.13.0" diff --git a/test_case/sugar_demo/pubspec.yaml b/test_case/sugar_demo/pubspec.yaml index 31c7b193..6e3d3a07 100644 --- a/test_case/sugar_demo/pubspec.yaml +++ b/test_case/sugar_demo/pubspec.yaml @@ -57,8 +57,12 @@ dev_dependencies: # The following section is specific to Flutter. dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_2_5_0 + path: ../../flutter_version/flutter_3_13_0 flutter: # The following line ensures that the Material Icons font is diff --git a/test_case/sugar_demo_tabbar/android/app/build.gradle b/test_case/sugar_demo_tabbar/android/app/build.gradle index 67942298..55bac098 100644 --- a/test_case/sugar_demo_tabbar/android/app/build.gradle +++ b/test_case/sugar_demo_tabbar/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion 33 ndkVersion flutter.ndkVersion compileOptions { @@ -47,8 +47,8 @@ android { applicationId "com.example.sugar_demo_tabbar" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. - minSdkVersion flutter.minSdkVersion - targetSdkVersion flutter.targetSdkVersion + minSdkVersion 20 + targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/test_case/sugar_demo_tabbar/android/build.gradle b/test_case/sugar_demo_tabbar/android/build.gradle index 83ae2200..fb8d72f6 100644 --- a/test_case/sugar_demo_tabbar/android/build.gradle +++ b/test_case/sugar_demo_tabbar/android/build.gradle @@ -1,8 +1,12 @@ buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.8.0' repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } google() - mavenCentral() + jcenter() } dependencies { @@ -13,8 +17,20 @@ buildscript { allprojects { repositories { + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/jcenter' + } + maven { + allowInsecureProtocol = true + url 'https://maven.aliyun.com/repository/google' + } + maven { + allowInsecureProtocol = true + url 'http://maven.aliyun.com/nexus/content/groups/public/' + } google() - mavenCentral() + jcenter() } } @@ -26,6 +42,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/test_case/sugar_demo_tabbar/android/gradle/wrapper/gradle-wrapper.properties b/test_case/sugar_demo_tabbar/android/gradle/wrapper/gradle-wrapper.properties index cc5527d7..bfd98901 100644 --- a/test_case/sugar_demo_tabbar/android/gradle/wrapper/gradle-wrapper.properties +++ b/test_case/sugar_demo_tabbar/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/test_case/sugar_demo_tabbar/pubspec.lock b/test_case/sugar_demo_tabbar/pubspec.lock index d322a0c5..dbae44fd 100644 --- a/test_case/sugar_demo_tabbar/pubspec.lock +++ b/test_case/sugar_demo_tabbar/pubspec.lock @@ -5,20 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared + sha256: e440ac42679dfc04bbbefb58ed225c994bc7e07fccc8a68ec7d3631a127e5da9 url: "https://pub.flutter-io.cn" source: hosted - version: "31.0.0" + version: "54.0.0" analyzer: - dependency: transitive + dependency: "direct overridden" description: name: analyzer + sha256: "2c2e3721ee9fb36de92faa060f3480c81b23e904352b087e5c64224b1a044427" url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.0" + version: "5.6.0" archive: dependency: transitive description: name: archive + sha256: "80e5141fafcb3361653ce308776cfd7d45e6e9fbb429e14eec571382c0c5fecb" url: "https://pub.flutter-io.cn" source: hosted version: "3.3.2" @@ -26,6 +29,7 @@ packages: dependency: transitive description: name: args + sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" @@ -33,20 +37,23 @@ packages: dependency: transitive description: name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.flutter-io.cn" source: hosted - version: "2.8.2" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" build: dependency: transitive description: name: build + sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" url: "https://pub.flutter-io.cn" source: hosted version: "2.3.1" @@ -54,6 +61,7 @@ packages: dependency: transitive description: name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" @@ -61,6 +69,7 @@ packages: dependency: transitive description: name: build_daemon + sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" @@ -68,6 +77,7 @@ packages: dependency: transitive description: name: build_resolvers + sha256: "4666aef1d045c5ca15ebba63e400bd4e4fbd9f0dd06e791b51ab210da78a27f7" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.6" @@ -75,6 +85,7 @@ packages: dependency: "direct dev" description: name: build_runner + sha256: "56942f8114731d1e79942cd981cfef29501937ff1bccf4dbdce0273f31f13640" url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" @@ -82,6 +93,7 @@ packages: dependency: transitive description: name: build_runner_core + sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" url: "https://pub.flutter-io.cn" source: hosted version: "7.2.7" @@ -89,6 +101,7 @@ packages: dependency: transitive description: name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" @@ -96,6 +109,7 @@ packages: dependency: transitive description: name: built_value + sha256: "59e08b0079bb75f7e27392498e26339387c1089c6bd58525a14eb8508637277b" url: "https://pub.flutter-io.cn" source: hosted version: "8.4.2" @@ -103,55 +117,47 @@ packages: dependency: transitive description: name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.1" + version: "1.3.0" checked_yaml: dependency: transitive description: name: checked_yaml + sha256: dd007e4fb8270916820a0d66e24f619266b60773cddd082c6439341645af2659 url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" - cli_util: - dependency: transitive - description: - name: cli_util - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.5" clock: dependency: transitive description: name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.1.1" code_builder: dependency: transitive description: name: code_builder + sha256: "02ce3596b459c666530f045ad6f96209474e8fee6e4855940a3cee65fb872ec5" url: "https://pub.flutter-io.cn" source: hosted version: "4.3.0" collection: - dependency: transitive + dependency: "direct overridden" description: name: collection + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert + sha256: "1be13198012c1d5bc042dc40ad1d7f16cbd522350984c0c1abf471d6d7e305c6" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" @@ -159,6 +165,7 @@ packages: dependency: transitive description: name: crypto + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.2" @@ -166,27 +173,30 @@ packages: dependency: "direct main" description: name: cupertino_icons + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" dart_style: - dependency: transitive + dependency: "direct overridden" description: name: dart_style + sha256: "5be16bf1707658e4c03078d4a9b90208ded217fb02c163e207d334082412f2fb" url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.1" + version: "2.2.5" fair: dependency: "direct main" description: path: "../../fair" relative: true source: path - version: "2.8.1" + version: "3.3.0" fair_annotation: dependency: transitive description: name: fair_annotation + sha256: "921581dd3979e64a8e246ac4af728aaa1edb65867370f44f8276b0bed20e3cc3" url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" @@ -196,39 +206,43 @@ packages: path: "../../compiler" relative: true source: path - version: "1.4.1-dev.1" + version: "1.8.0" fair_dart2dsl: dependency: transitive description: name: fair_dart2dsl + sha256: a4e859678c0dcad711d688c0e82998fde5e75d2f5f5620d9b2c6d7426d22acbd url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.4.0" fair_dart2js: dependency: transitive description: name: fair_dart2js + sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_3_0_0" + path: "../../flutter_version/flutter_3_13_0" relative: true source: path - version: "3.0.0+1" + version: "3.13.0" fake_async: dependency: transitive description: name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" @@ -236,6 +250,7 @@ packages: dependency: transitive description: name: file + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" url: "https://pub.flutter-io.cn" source: hosted version: "6.1.4" @@ -243,6 +258,7 @@ packages: dependency: transitive description: name: fixnum + sha256: "04be3e934c52e082558cc9ee21f42f5c1cd7a1262f4c63cd0357c08d5bba81ec" url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" @@ -250,6 +266,7 @@ packages: dependency: transitive description: name: flat_buffers + sha256: "23e2ced0d8e8ecdffbd9f267f49a668c74438393b9acaeac1c724123e3764263" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.5" @@ -272,6 +289,7 @@ packages: dependency: transitive description: name: frontend_server_client + sha256: "4f4a162323c86ffc1245765cfe138872b8f069deb42f7dbb36115fa27f31469b" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" @@ -279,6 +297,7 @@ packages: dependency: transitive description: name: glob + sha256: c51b4fdfee4d281f49b8c957f1add91b815473597f76bcf07377987f66a55729 url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" @@ -286,6 +305,7 @@ packages: dependency: transitive description: name: graphs + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" @@ -293,6 +313,7 @@ packages: dependency: transitive description: name: http + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" url: "https://pub.flutter-io.cn" source: hosted version: "0.13.5" @@ -300,6 +321,7 @@ packages: dependency: transitive description: name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" url: "https://pub.flutter-io.cn" source: hosted version: "3.2.1" @@ -307,6 +329,7 @@ packages: dependency: transitive description: name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" @@ -314,6 +337,7 @@ packages: dependency: "direct dev" description: name: intl + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" url: "https://pub.flutter-io.cn" source: hosted version: "0.17.0" @@ -321,6 +345,7 @@ packages: dependency: transitive description: name: io + sha256: "0d4c73c3653ab85bf696d51a9657604c900a370549196a91f33e4c39af760852" url: "https://pub.flutter-io.cn" source: hosted version: "1.0.3" @@ -328,6 +353,7 @@ packages: dependency: transitive description: name: js + sha256: a5e201311cb08bf3912ebbe9a2be096e182d703f881136ec1e81a2338a9e120d url: "https://pub.flutter-io.cn" source: hosted version: "0.6.4" @@ -335,6 +361,7 @@ packages: dependency: transitive description: name: json_annotation + sha256: "3520fa844009431b5d4491a5a778603520cdc399ab3406332dcc50f93547258c" url: "https://pub.flutter-io.cn" source: hosted version: "4.7.0" @@ -342,6 +369,7 @@ packages: dependency: transitive description: name: logging + sha256: c0bbfe94d46aedf9b8b3e695cf3bd48c8e14b35e3b2c639e0aa7755d589ba946 url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" @@ -349,27 +377,31 @@ packages: dependency: transitive description: name: matcher + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.flutter-io.cn" source: hosted - version: "0.12.11" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.flutter-io.cn" source: hosted - version: "0.1.4" + version: "0.5.0" meta: dependency: transitive description: name: meta + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.flutter-io.cn" source: hosted - version: "1.7.0" + version: "1.9.1" mime: dependency: transitive description: name: mime + sha256: dab22e92b41aa1255ea90ddc4bc2feaf35544fd0728e209638cad041a6e3928a url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" @@ -377,6 +409,7 @@ packages: dependency: transitive description: name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" @@ -384,13 +417,15 @@ packages: dependency: transitive description: name: path + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.1" + version: "1.8.3" pedantic: dependency: transitive description: name: pedantic + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" url: "https://pub.flutter-io.cn" source: hosted version: "1.11.1" @@ -398,6 +433,7 @@ packages: dependency: transitive description: name: platform + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" @@ -405,6 +441,7 @@ packages: dependency: transitive description: name: plugin_platform_interface + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" @@ -412,6 +449,7 @@ packages: dependency: transitive description: name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" @@ -419,6 +457,7 @@ packages: dependency: transitive description: name: process + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" url: "https://pub.flutter-io.cn" source: hosted version: "4.2.4" @@ -426,6 +465,7 @@ packages: dependency: transitive description: name: pub_semver + sha256: b959af0a045c3484c4a8f4997731f5bfe4cac60d732fd8ce35b351f2d6a459fe url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" @@ -433,6 +473,7 @@ packages: dependency: transitive description: name: pubspec_parse + sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" @@ -440,6 +481,7 @@ packages: dependency: transitive description: name: shelf + sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" @@ -447,6 +489,7 @@ packages: dependency: transitive description: name: shelf_web_socket + sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 url: "https://pub.flutter-io.cn" source: hosted version: "1.0.3" @@ -459,6 +502,7 @@ packages: dependency: transitive description: name: source_gen + sha256: "00f8b6b586f724a8c769c96f1d517511a41661c0aede644544d8d86a1ab11142" url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" @@ -466,27 +510,31 @@ packages: dependency: transitive description: name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.flutter-io.cn" source: hosted - version: "1.8.2" + version: "1.10.0" stack_trace: dependency: transitive description: name: stack_trace + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.flutter-io.cn" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.0" + version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.0" @@ -494,27 +542,31 @@ packages: dependency: transitive description: name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.flutter-io.cn" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.flutter-io.cn" source: hosted - version: "0.4.9" + version: "0.6.0" timing: dependency: transitive description: name: timing + sha256: c386d07d7f5efc613479a7c4d9d64b03710b03cfaa7e8ad5f2bfb295a1f0dfad url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" @@ -522,6 +574,7 @@ packages: dependency: transitive description: name: typed_data + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" @@ -529,6 +582,7 @@ packages: dependency: transitive description: name: url_launcher + sha256: "568176fc8ab5ac1d88ff0db8ff28659d103851670dda55e83b485664c2309299" url: "https://pub.flutter-io.cn" source: hosted version: "6.1.6" @@ -536,6 +590,7 @@ packages: dependency: transitive description: name: url_launcher_android + sha256: "2514dc16ac169adf55159268d7bf70317d9f2fc9ef5bb02020bb7ad710c0aeb4" url: "https://pub.flutter-io.cn" source: hosted version: "6.0.21" @@ -543,6 +598,7 @@ packages: dependency: transitive description: name: url_launcher_ios + sha256: "6ba7dddee26c9fae27c9203c424631109d73c8fa26cfa7bc3e35e751cb87f62e" url: "https://pub.flutter-io.cn" source: hosted version: "6.0.17" @@ -550,6 +606,7 @@ packages: dependency: transitive description: name: url_launcher_linux + sha256: "360fa359ab06bcb4f7c5cd3123a2a9a4d3364d4575d27c4b33468bd4497dd094" url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -557,6 +614,7 @@ packages: dependency: transitive description: name: url_launcher_macos + sha256: a9b3ea9043eabfaadfa3fb89de67a11210d85569086d22b3854484beab8b3978 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -564,6 +622,7 @@ packages: dependency: transitive description: name: url_launcher_platform_interface + sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" @@ -571,6 +630,7 @@ packages: dependency: transitive description: name: url_launcher_web + sha256: "5669882643b96bb6d5786637cac727c6e918a790053b09245fd4513b8a07df2a" url: "https://pub.flutter-io.cn" source: hosted version: "2.0.13" @@ -578,6 +638,7 @@ packages: dependency: transitive description: name: url_launcher_windows + sha256: e3c3b16d3104260c10eea3b0e34272aaa57921f83148b0619f74c2eced9b7ef1 url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" @@ -585,20 +646,31 @@ packages: dependency: transitive description: name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.4" watcher: - dependency: transitive + dependency: "direct overridden" description: name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.flutter-io.cn" source: hosted - version: "1.0.2" + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: name: web_socket_channel + sha256: "3a969ddcc204a3e34e863d204b29c0752716f78b6f9cc8235083208d268a4ccd" url: "https://pub.flutter-io.cn" source: hosted version: "2.2.0" @@ -606,9 +678,10 @@ packages: dependency: transitive description: name: yaml + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" url: "https://pub.flutter-io.cn" source: hosted version: "3.1.1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=2.10.0" + dart: ">=3.1.0-185.0.dev <4.0.0" + flutter: ">=3.0.0" diff --git a/test_case/sugar_demo_tabbar/pubspec.yaml b/test_case/sugar_demo_tabbar/pubspec.yaml index 755b35ea..8c8ef045 100644 --- a/test_case/sugar_demo_tabbar/pubspec.yaml +++ b/test_case/sugar_demo_tabbar/pubspec.yaml @@ -57,8 +57,12 @@ dev_dependencies: # The following section is specific to Flutter. dependency_overrides: + analyzer: 5.6.0 + dart_style: 2.2.5 + collection: 1.17.0 + watcher: 1.1.0 fair_version: - path: ../../flutter_version/flutter_3_0_0 + path: ../../flutter_version/flutter_3_13_0 flutter: # The following line ensures that the Material Icons font is From fe47850277e0fed21b30cc1a2b6b22f6ea2a8a5b Mon Sep 17 00:00:00 2001 From: lanhuajian Date: Mon, 6 Nov 2023 14:48:16 +0800 Subject: [PATCH 10/44] [feature] Abstract fast access interface --- fair/lib/fair.dart | 5 ++ fair/lib/src/adapter.dart | 22 ++++++++ fair/lib/src/app.dart | 71 ++++++++++++++++++++----- fair/lib/src/internal/global_state.dart | 17 ++++++ fair/lib/src/public_type.dart | 2 + fair/lib/src/render/decode.dart | 11 +++- 6 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 fair/lib/src/adapter.dart diff --git a/fair/lib/fair.dart b/fair/lib/fair.dart index 2f71a467..c0a740a8 100644 --- a/fair/lib/fair.dart +++ b/fair/lib/fair.dart @@ -15,6 +15,11 @@ export 'src/experiment/sugar.dart'; export 'src/module/fair_module.dart'; export 'src/public_type.dart'; export 'src/widget.dart'; +export 'src/adapter.dart'; +export 'src/internal/bind_data.dart'; +export 'src/render/builder.dart'; +export 'src/render/domain.dart'; +export 'src/render/proxy.dart'; export 'src/runtime/plugin/fair_plugin.dart'; export 'src/runtime/plugin/plugin_dispatcher.dart'; export 'src/runtime/plugin/fair_common_plugin.dart'; diff --git a/fair/lib/src/adapter.dart b/fair/lib/src/adapter.dart new file mode 100644 index 00000000..96b2717f --- /dev/null +++ b/fair/lib/src/adapter.dart @@ -0,0 +1,22 @@ +import 'package:fair/fair.dart'; + +//adapt third-party library +abstract class IFairLibraryAdapter{ + //provide the generated module + GeneratedModule? provideGeneratedModule(); + + //provide fair plugins + Map? provideFairPlugins(); + + //provide js plugins + Map? provideJSPlugins(); + + //provide dynamic widget builder + DynamicWidgetBuilderFunction? provideDynamicWidgetBuilder(); + + //provide fair delegate + Map? provideFairDelegate(); + + //provide fair module + Map? provideFairModule(); +} diff --git a/fair/lib/src/app.dart b/fair/lib/src/app.dart index 50e787f2..2638af8c 100644 --- a/fair/lib/src/app.dart +++ b/fair/lib/src/app.dart @@ -7,16 +7,12 @@ import 'dart:io'; import 'package:fair/fair.dart'; -import 'package:fair/src/internal/bind_data.dart'; -import 'package:fair/src/render/builder.dart'; -import 'package:fair/src/render/proxy.dart'; +import 'package:fair/src/internal/global_state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'internal/flexbuffer/fair_js_decoder_http_decoder.dart'; import 'state.dart'; -import 'type.dart'; /// Application which can update the widget tree through bundle file. /// @@ -64,8 +60,7 @@ class FairApp extends InheritedWidget with AppState { final bool debugShowFairBanner; /// Define a custom DynamicWidgetBuilder to solve special case - final DynamicWidgetBuilder Function(ProxyMirror? proxyMirror, String? page, BindingData? bound, - {String? bundle})? dynamicWidgetBuilder; + List? dynamicWidgetBuilder; static final WidgetBuilder _defaultHolder = (BuildContext context) { return Container( @@ -119,12 +114,17 @@ class FairApp extends InheritedWidget with AppState { properties.add(DiagnosticsProperty>('bundle', bundleAlias)); } - static void runApplication(Widget app, { - Map? plugins, - Map? jsPlugins, - String? package, - List? baseJsSources, + static void runApplication( + Widget app, { + Map? plugins, + Map? jsPlugins, + String? package, + List? baseJsSources, + List? adapters, }) { + //init 3rd-library adapter + initFairLibraryAdapter(app, plugins: plugins, jsPlugins: jsPlugins, adapters: adapters); + // WidgetsFlutterBinding.ensureInitialized(); FairPluginDispatcher.registerPlugins(plugins); @@ -139,4 +139,51 @@ class FairApp extends InheritedWidget with AppState { Runtime().loadCoreJs(package: package, jsPlugins: jsPlugins, baseJsSources: baseJsSources).then((value) => runApp(app)); } } + + ///[app] FairApp + ///[plugins] Fair plugin code with Dart + ///[jsPlugins] Fair plugin code with JavaScript + ///[adapters] 3rd-party libraries which adapted Fair + static void initFairLibraryAdapter( + Widget app, { + Map? plugins, + Map? jsPlugins, + List? adapters, + }) { + + if (adapters != null && adapters.isNotEmpty) { + adapters.forEach((element) { + + if (element.provideFairPlugins()?.isNotEmpty == true) { + plugins?.addAll(element.provideFairPlugins()!); + } + + if (element.provideJSPlugins()?.isNotEmpty == true) { + jsPlugins?.addAll(element.provideJSPlugins()!); + } + + if (app is FairApp) { + if (element.provideFairModule() != null) { + app.modules.addAll(element.provideFairModule()); + } + + if (element.provideGeneratedModule() != null && app.proxy is ProxyMirror) { + (app.proxy as ProxyMirror).addGeneratedBinding(element.provideGeneratedModule()!); + } + + if (element.provideFairDelegate() != null) { + GlobalState.instance().addExtBuilder(element.provideFairDelegate()); + } + + if (element.provideDynamicWidgetBuilder() != null) { + if (app.dynamicWidgetBuilder == null) { + app.dynamicWidgetBuilder = [element.provideDynamicWidgetBuilder()]; + } else { + app.dynamicWidgetBuilder!.add(element.provideDynamicWidgetBuilder()); + } + } + } + }); + } + } } diff --git a/fair/lib/src/internal/global_state.dart b/fair/lib/src/internal/global_state.dart index 63d57a74..09eaa167 100644 --- a/fair/lib/src/internal/global_state.dart +++ b/fair/lib/src/internal/global_state.dart @@ -39,6 +39,23 @@ class GlobalState { _builder = builder; } + void addExtBuilder(Map? extBuilder) { + if (extBuilder != null) { + try { + if (_builder != null) { + _builder?.addAll(extBuilder); + } else { + //when _builder is uninitialized + _builder = extBuilder; + } + } catch (e) { + //caught when thrown “_builder is an unmodifiable map” + extBuilder.addAll(_builder!); + _builder = extBuilder; + } + } + } + static String id(String? prefix) { return '$prefix#${GlobalState._counter++}'; } diff --git a/fair/lib/src/public_type.dart b/fair/lib/src/public_type.dart index 7fb10b55..7a97cd76 100644 --- a/fair/lib/src/public_type.dart +++ b/fair/lib/src/public_type.dart @@ -20,6 +20,8 @@ typedef FairDelegateBuilder = FairDelegate Function( typedef FairModuleBuilder = FairModule Function(); typedef PropertyValue = T Function(); +typedef DynamicWidgetBuilderFunction = DynamicWidgetBuilder Function(ProxyMirror? proxyMirror, String? page, BindingData? bound, {String? bundle}); + /// Interface of bundle loader abstract class BundleLoader { /// Load resource data into json object; The path can be either assets key or diff --git a/fair/lib/src/render/decode.dart b/fair/lib/src/render/decode.dart index ba9f6446..959b928a 100644 --- a/fair/lib/src/render/decode.dart +++ b/fair/lib/src/render/decode.dart @@ -76,8 +76,17 @@ class Decoder { bound ??= BindingData(app?.modules); bound.data = data; } + + var dynamicBuilder; var proxy = app?.proxy; - Widget w =( app?.dynamicWidgetBuilder?.call(proxy as ProxyMirror?, page, bound, bundle: url) ?? DynamicWidgetBuilder(proxy as ProxyMirror?, page, bound, bundle: url)).convert(context, map, methodMap) ?? + final dynamicBuilders = app?.dynamicWidgetBuilder?.map((e) => e?.call(proxy as ProxyMirror?, page, bound, bundle: url)); + if (dynamicBuilders == null || dynamicBuilders.isEmpty) { + dynamicBuilder = DynamicWidgetBuilder(proxy as ProxyMirror?, page, bound, bundle: url); + } else { + dynamicBuilder = + dynamicBuilders.map((e) => e?.convert(context, map, methodMap)).toList().firstWhere((element) => element != null, orElse: () => null); + } + Widget w =(dynamicBuilder ?? DynamicWidgetBuilder(proxy as ProxyMirror?, page, bound, bundle: url)).convert(context, map, methodMap) ?? WarningWidget(parentContext:context,name: page, url: url, error: 'tag name not supported yet'); return w; } From 00b8c8f4593927e0d16380b5d9cdce748276323d Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Mon, 6 Nov 2023 16:24:46 +0800 Subject: [PATCH 11/44] change qr code --- resources/wechat-group-02.png | Bin 23753 -> 23548 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index b0ea936e5ae24c7dfacd20ca2c6d3bebb3d1856e..2e25f507ab47e8dcf3dd714b891741500e6d4f64 100644 GIT binary patch literal 23548 zcmd43byS?$7cE#wa0?QGOCV?cJq{WpW5V$kg9~30; zPT%BW2>2hOsfery1X31`e*69rcui?2tt1P9xIc$LeEcDhYw(uO76jt-5(3#VfIxVE zLLh{;iS>&7-~*%&Z>7W`53qkzn{s}DcTjDmH66g;cntdk*Zcfb2m;YIcq1;N;ySwz zbxRyGx<@`58grJj4m9K;kWeIiZ2S0;h%vr|1}lzAr{N<_5q@D^4cjISMI1sW5e@Is zV)z0KN)(LxRQehpc=&WmE);vr_E-HA8&`Lc)smwXwckx%A-b8Yo~ z6Guq~m71Db#tf@~U07UPyv$ITj+(k04#^R`OJeZ<;}@m6!i1vJ7NhLuqcrWiCdS5b zF{~Mqp~R}obKi`v&$a_kIb4qn-VUM**tFa^&qp6Ox}9Qdny+<7#^`4dxb17$>1yff z9jn|Q4?4poefg5h_TiuIHgRdAlf3>YJXdYiK3J3fjp66W z?kK%iPA4H%R+O4)x{ixLSK ziud^O3e5q2f z72OUlQ1)#?e~$XSY&=I9?FFge-@S_04`ClQf%qqNhEv$MLN&5As`ECRE*2_ih8&YM z*Qe7ZzWVb~tiF^7C#6*itB}0!WX8oxKRm@4v2Q!_fbIET{-*d|ssF%FnpYE6&PN|uze zg9|H#IJKN}(QGVRwl3$YgHV5|#QV-N;IMCFAc4svL3oXAzSb@y&GF)J(WdAACxeb= z60Z{)r^Wcos10z?K5z@wEPC-_Q3#T9twSI}54R2hn_cgs_xUC)Ft(znvt<+72HD-I z-1*6&jsv6ls!Ytf^_6WkmXpn|t!DA(YHYCi77JNr*yrA8+v#of^!2eP=4kXT=2veS zd3&tMiHjQ{U~B=*c-`vrKfj1(OvMJ_QTe#8|7p+HFZ9XBe4NcH`99WMKc35u3Y47( zzTKOvDOrXcXu7@EpU$@4_e4a!jb-69b{#Yy%O+x3rAu~g`_4+v-g4CcwAkffzAmta z=fiK5vEGr8*IWD_Zl0xp9Y_ATY@_-|KtU*FfN?r!SH!3kUEy=mXKtWD!l`@~Ix zF)X?kt_j*T))IX&FE9_oNA~0Eibovf6S?1Od7Xz9Y2M)Vy&jO^S|}rP_i_EWSy(gh z=Ew8*!>J;HlLNiIZQqF4-}S_57Fv){pl7(%@0ItJdfqsXov4o7Xl2O|B=Wfo?l7xa zm{b*n2P`-b?0B~hQiX@l|ErMwNH`pTQ~!gUA?v`%5jt6%cISl0j5i)H0LGjQ^!E6tUsuf}rZxe}e#)MA#M&Z|in zbTf971wKt4-TzjSi~Ow=rZ(JnxZEBj%Y@7x?)zBi_Q-ES^Gm!Q(cxkXg>1s>q9Yi5 zcSkwGtu7LPRcFs4l_m+2f0417{0YmZ>0E94$^`SAFj!NJnpl^Mjt*JC{p@8{;+c_& zi6p7|+&6wr#ZHqAh9{CWd^QXG^PU&b?6s+U%RaOE<9eZEjVJEh9*mD4Kc;2=r;rEP zEF3^&ws$oZ2g+(`1C?qQ_8J`@UqXAi1^9&^k>`K=?DDOx#lNu{S@6hhWA z^=@u%fm57)V%P%y5?`OheXrKM$%sAJ9?OxPc^;j#aLnU!kjStNU#43lSyNCmpjx0t zw6Ng=hj6r=lcIKc|1;X!+Pauw?i;PVNfN7_$Sek={YTs!C)1E*%}kArKFHKYMnAvj zsOx)9l&=!nXjPg;+TK`9mc6aCwCs&y2%OrVDoI&(O5ia6Fnh117-o|6)wxsZ;J?Al z-{(VNJHCjh%4C4JFWx|dijIzMukrI|_<{;Tr{r@<&rxmG(R!2hslsedZ~zdn$ob7& zJ(+r`M@R)drjMG*xoumIoYB$Iix$pviJDBjuht3orpwxQ_PQtv3TD(ZyG~1#jHVQsKg55Ek?gh+hqkCL-~x4uHSdCMaax*aZms8eKimg~TQS4- zak|V9vt%wq3L9FzaqQYe$F`96PpsfC?3^y1nax$qXd9fXcPcP9f7rM2M&~>1j(ny@ z_%^a=;rbG33m^I6P+t%mEr&PO7iSEr*bnP&!u&7~Qs4W+Ki z@BclT^%k?pG6ogzxj~yh>if+u`{oY&`2j}sjP1b$E>@PHdCqzv?C?>__O$zFf_$#7%X*{o*LDE6<2bE$3xC%ZA=3rPXB)9Mw0<~lIe!*4ZTJ91R7 z?|H5|?N(tj(6-j|19N|{1v|s7S|)S%8TskQz$(ir@WV2{wl2z&hQz35 zehv+Vye?4d`8xxwSa?f?5(g0KdyGW!6IuBIcy{E!T=H9QE-4G?a^5r@vN)+P<=-zTwBLl$gp(j7t4@dcTZ}~Jvhu*RiRM$Q_-r~RCUn46 z11HJ&U0*(zOMI$+bNy$|CIO)FWRX%<2*YMSI5n@_&&=B0sy{=UnQ-mA_d@<$vCdt?Lue4Y7%gFM@5E#e(Sur&Xt$p!1#v2FdIGVHmUUO-v*e zn+xqSBs_Et`k$%F|02g2G>lAA#|e7Yr=3@SocYXD(#TePVkG5m{N8b#o%#j4>7e+V zH^FI6&vYw}or^(c!&~&au?pC{I9hJc&TKI5dvbf!j-8#EG;Bo6=CJV&wKa<2iAh#L zj?H3o_D2`MssqP7&nMJhFreor0yfI~wi&xn!{vCTBSuFX+Tg;Kg<*KbQo}B2|E~^J zuH*jj0B&DtARAVYBWFGck{As6r{vAi&{nMbo)*pxhR87 zL`sOnV_V*d*1aS@fgm5TE*j@MM!PMs4ppGp4?#cV=yW^!P*7`P6T8;b^|NO<)oMr&O3sY z@x)+ki2UQNra?b)>$#PV>#-g3te(4|Cl%u1WH2rcxK+|Iw8GQo$ftk8KL5z!htQD1 z+wwxfsc(1b(U#yS8!xuuskefBad1PBHJW-ti^I_!cej3P5AiCLWY=RZz9yOu#zp3f zL8Z*%;NJ%99Md1?Jzd6jd|iwC)kMMv^YSNey&4?1KUipLra8Vmr*F;3z~}#yPeLbO zN9BK(ECg>Ij>7G{;7v=J;7_zPkpLT z6K{-@!aAPKIKn{^~*SDOPFgB zxbUMS^9U5N=&ct&_3pyCe9#ZecM#p~9k!iUmkH;e7L2e)474BzfAob*q92UHN|ti) zW${)kHIzq9lyeh|K)0#lg0ng2vLWCO<>R#RxX3>Il*|ILyC2j=gUb>7_4DHG%N0*f zJm0FNVEX1)U}NH1mozot=g$*A`vu7?*`m>hptz17SXw{Fk!@5RBRuMI%Bz+lRBFpW z$*jX~d?+J1G%ASR^$1)45lV7aq&UKRZ6><@)}8oOrLTBmTMfxK`j-KLw~x{Zi$Ln%NpE<0N*K8%fAqush3 z@w2(xPYAj$TCkxOE0-Iq=g#l}@40|vNmGjV{mhPTxP`a9g9B!)n6)*F#Z<8sy->^j zH4`zX1-^6hi2b)ST|G_Jd>^mvkO!6*~jXoc$?voeW+2j z1n=TA3`SoDJs=0!P~6^ZS}|@qO13~XYM}=|iz(QPo4oF>)AU=s-fv1-uv(uHo6lC} zE#C!K!j=RhHi*cWbi1LkeC3%7^$+PhFP;VgwwHf?tt%naj^)WU8|ba5ZF-kWw^0!| zK?uB|HA@`*E9g5GhxWL%lg3YjH5%5Kb~^&S;0N;3OxGrtOV;G zo;z`e7ju`#)>9k#pg}d&kZBqFV2>iXTL*;pD_)_ko-6w3Pe`t(V!;pn7p?nhw*-R_ zN}iq@`dOjcJmOZUHRVI%^&11i;uuWRd^OLY8bjVhCY94|9AOK#RK)RW7nE(!eym&f z-+uCf>PJ1)shW6%l4pdq1*ccWJb!p2c`mV%=#jL1xBVXB79BVl_9o)elVg*LwypCE zEy)IJC(T=Pe!001a*dJFvF&lKN`7F#}0|+^6pQ$WQvYns`0Ml9e<^(*!z)rNb7dQbYl^s zw`*%C(E~c!K&VJkt_MmFWA1ueVK%)xD5d>H{E$?)UK<+sWUQimi&EYu*~H87IgocN zbx0v$Axx!jzUW-2Y_b~kaG5_=M=L{T`O*5^Y5~ntNwm$^l)~=)wAi{b{4=Sr-&-RY zva=Kp#S~16c+|lUR*jX z%Qk%E(*+4tQ_q(uCzRs)u0GR%E0 zE>bL;P^ZPxY!q_Lfnr~s0uPT8j3ubIehDu*L&TcG%i|Vnk5XZK4z6_j-#&6iKCCDL zr`W+ME_vZIp3z;mvdwE(3s6RAd%KUpfz2d~zxNk4xJP0S%fC94cFe5B@%i**#1)n1 zLJ`o_;n|OTU>g{Fx$E!{Pp~X-O8+SmUp1-OKp$EcC5^A695j6lLB&^IUXEc?BbUS*IEDGKfOH=p+r#h2yBl8sYjFRq5OsM`6&jw8kOr@#Gr}PVJN* z*poZx9(vRt)bGBVInPth>2#FsIuXFP9wQ%p6}UKNO6Bo4Z_e)%vb|X5cZ%{On!App{SF^D;Nyx$;wa@C<0?q*Ai63c zMlioJjU(0N?@t$(EupwFxJ&Pl@ofy0JVY2Zg|kt)(ctKhT7+Vw z_apfb{o$p9eCU;g)JGph;FFF=(^TE69Yk>3Js0F7r(^wl%o2q+-MVQ-x+Y(I&N&ruOFo0(8yXR{dUS_ zXs?#VR2E>D)V++OKvTLN;r}k$mJYQWAGL!dHOff%4TAs0fld(tk~9_5)Qtn8$~R@2 zB^;apit=$v09fAy?Rw2Oor^lJ5}m^?m^9^ofKeSVc3QBwpv?5BbQIV*{z)b3_(K90qzmr5FWTp-$By!xcE*2!kwtG4DQFh{U8&xU6bR_XIC^6Ha*-oj zyAB~}<_cdP3@0rN&XPg!DLn%&Cda1oLNZPS>@Qp%w5X|+5lKyHLK4vN^_P8C3yFu9 z)o!Lw&%GD#+2~@7f+I%u&NMhZ@(ILJV~iV2_AHq}J3%YBO+Fyk5!3{dm(7wSs>n+D zkSnw$8F+kbO46eivDh99yw|49TE}l);k(3Y+*ujJYOeec7f8v^FB`Ms!?^nnYvk)^u9%Sn&)T%=8FqpC_RKEqU=R zvQGIm0`6!E_Pz+BzV0sM(c8KHdfXjP=Sd)6pzbCKIzt2fDT=4Y?KIAC_V_9=@p z6A{1Fu9NRNQCS!tV(QMDmWe{oa^4f@=-$UP17}+9^L;~jXv2b>9ju1!|`s@I#0Gvyma%RzaT4!s&C(ju6{6Z8050I^~%7vu2r# ztl4063Czwmzb(Gs#}dv#*E=F=s*4Fb_9tsZsiCy)V|tFL^;; zuP~sXL<;@z+rGH7ym+C`;*4Lf+$i_}2M`~jI90i_*UGXg)#zK|CMQjcp4T4?R>*xn zx3ya94b@1+_CWZB7a)ZB1E-XpdGOqDS@{>b4K+v}DjtWc(49}_R1-V8 z(tM#eng*1FA^!A=r>Mx3x)whga#Q9|T`emRsP)_IaBZg^$zj^2t%<^IGB~wJq?P1w zJAHE{q>&+o_pXPSC1bfZ%3cR|KLr~}Uq^eyNBHvW0=~o=Puf?!>`c)9&m)VRS*f}V zjTOfjyZ|e*-12F^wSC+{yiq<1WAx-^gFTpQI@_9 z71qlfR307Qa6WP!>y5>+j@q|g?8^8v#zN+k!(w~z9Qnk?Ni-W0ri?42>SX&QF7UJj zm2_v-$uy)Dov?u9!%MmlOb`%J9*3j)7V!Opc+<`*`(Jew8wHw?5S?fxTI1019~OL9 z)Uay*NYfm~*xoTNcmKF=(1t7{h;iG=4eyK|KP9;0c+~75uQc~FmVCBIRTC4O$^NNw2yEOAA zYvq-?KE%TPf-0sWd2~=M@n$Ye5b9GajL-V6^dZh;l0~SddNGMBZx1dHWFWU{w%VzX zJtxSsc;OP~B`C0sm`EPHLgQ=A`RIOBL-zBpM0#f!LBI6GJ=$J}zqo~`@4%(*m}}v) z6~tlkDO|qGP!LT#^&%f=uvj#_pn=Ou7Jkp}+g1$EeIPztgO=ZaLFrZl?;-{lm3ugA z96x(r=$PxPrv^uw15u>6JCH;^Y2cZlAT)>Prt|fHJi-NGLSEPBbDM=iPh>&96l0+a zudgNAx*U0wiK-KW9X!yVy)KE#9R zNB9J}kqSj;EFPY}^9I@)o4Vk#;=`hYYmnT_XWwJe_=pOVsw8|~7upjYnZO#q|Aa~^ z;qx7hJ6zgzCqI1p)W&J)><7!a)UWr4pU#coGzSu5kav=tmP#VaH<%6V9=uSizLVqU zIbX#y4^t6cu6#(1%(L}k!4?@x81a?I44Ot9YT;7@=2|fw(7Oy>Z!-+h74nK*r@X)PPk$F~=K#22H zjl{J{^T@80?WfDuFr4LNA!tS~@UT1WsGJ=xF4{I1KCR|lxbC4x4=h%&8xKWL{D5|= zXTAkd<0Aa&g{sgJU!%^E*R1X$6HFt`O$Ev@C21#S+rySfIyfrC%nQZpqXpHk4!HD) z3fhn^xHzP>djZq~47e$*M>!O>R1b=TzvUiDBS*l0VOJ_TK8RdUU)o{Cb|U$b$i+aF zsX!O*V_R?&%RFIPSA_Yp^T@ew}UR8*Ge++ou6p@=6b&Qv^I zeih+-%eNA~In|Jm@jn~jtL_eI3UkvpygefW39VO~dkYuqju- z8(Lar0~a(Txb$}LbWnJSj)l|$X>Kwfoc zaJN+pp1*Wl6RH?+6cCqe;W(9i^JVfbR#03eC?Pe-^e4FlTm06k*@!IpSUT%C-GvMz zb-W4!FU|z&N<5zS2lr9{@a4hHg0IxhKdd6=eRNRpXkPto5>uKQ8#Y=L@pc}VOyklC zw8l{T64l|3g`?vWnnJPr8|(<^-NJI{SO^0KkhaQWsm-d?A_FqaTB`%GEsMMKcLn|@cK*k z!Kd;a&}PVHQi@V_)a}Eh9XwYS0#_D#6#aM`5jrkE zg`6TgR4FMcg|xP?;9e?+j?VdA1d0E=qe+p!Q| z%BZ|`>442OmiQ>26r#{hRhmllaz!+^J?i>1@7h)U5iM>xn5F9r3 zN)aCQ%hOp9$O}9i3hu?KYG&)z1Sh5;x1lLM6%ph?` zpiua9n(}eS3otb&$=!x0RtuU{O|YSS`ao7+GZTLyDe&w_fba1P(p(zej1R=t3bR#_ zS>YKf_a@wElh73H`0`)@`cf&pj*`UP{I82m@oJ?!cz0*#*Y{^RLPUB(LPCqf?pAZv z9e?)cm^{1-RPu10^%NB!D=D?PSbcERcd)k~Zg4rYmye}Rm=T6x_BMMc(V}d*PeBX@ zuPzV0A4uc{uQFlNpIAxHhr5gV(;|90MsFZ_L1+b92S$$sB^l^Gu@xbY?UFDCDfi30 zTj_mnFixx(t#Y_gWRv38J5*b{+9@b0KCJW!OHLsX!ix=VS^`59XDJjej>bTkifOFkA&2jigJ^v#^Bmwy4x? zCv8d&#er$f#153vMY1L1!<*QtLb!6=I39;=n?|&OH$xRef&~rM{BrKsfA%e9X3+^* zIDqKquW9$bk_Y?l^$5FhFaFzV%a~V&oj+q1#TkRdTmNZ1{~vu&wPg^wx&Ny?b~JhB zU9I<{nQxwQm_>j=&s;OEDo4{H0(%K|#vB-VGhmT&8<;^|Zx=Y2mBQcW7&d)j$Xb5G3YAu7o}0+18PJF? z+y(=(vdnL>EV{(Xv&-3FN)zWSxMNiVWE_D*Ij+W&_fMMysf$SZILZ2qDlxE0xp9;= ze=2suBrWSV1{?ix*-3c8g-VZL($9u}5<~g|=CD)mw2M)4v+|X7rH{3RgI1r6*YRcJ z!Old1Y|jtHGK_7D=NZNxd(*Fg8nVJ96ex5g2g>uAS5%pA3~S0?ejTyD2C9*FJ@U+p z>($ShB7x9C2J)UxU`X($aM=kgJJ<#0AITb%oEBhWnr$`KU;gshkUamf|FWZYrP*Vb zo7oCedF9b$K9}NU{?Mnd+A1yk@_W#NtA)xuV&{m!yyPDwkN*)jkhwFrOG#>}6O+2z ztagTG@9k#3`SA{_|IB!#>5~i8p3N`;5)l_?-ZPwLlEe;E(!HDGd?s&Fw_Du6%wr1X zkg0R(KAP)B9d7kTJ-CkhvsG;uoKMPhwB2_*SDRx9|DDW&OhbV8okR$SsC;G*bHDP{ zTF+L!JCJ{vXlYIteLK(0$w~NbU6@g%Y3EVMTP+z%#NKJ^1%S%BhbLKjT|4>z#c(@Y zE{WKA0jLDtzeyIn-g*`l6{T`{zjJkeb7%+V(p{>_kW?`3$X@GVEQ<;laXjy}y*gRH zT#waf^zfdyu3?zFJ?Ucw^V4>}VBq98p1j6rjOGwflLA=^*vq$JR_RIdYMw(| znvJey%T}GESkQb!%MPB$*q7b^pehCJ6Cgfqb>1I-rl`$fh9~+|jtl61tfmUfzet%x zD>DNz&Rx;F&9a5pQemXQBN=Bt`jZs zA6$`1?oY2NiPd!`0%e9Z0L#6pRGDZ-ZkGd{02?my4ttNYKUDw&xNVnw(wtTm`TtPi z9R9mC+!OvwwUum|;`uteav=T#1A4_|)y_1r?i8al-+|;*5-i@V!a%%zw;zY)gZAA& zyHi8o9VQCd_5h&H!!%ob|4KpbE5qfHpA61;U{Y*stf|wV^uY?%IcSS_OWL_yieM{foG4aI796|0x%{bVyE>iJH) zHCt6+^@k3($>I6PA6nvnMC6avPXcJ)#`q_>^u4J0`Mp^61}}VD>;2|n(sYGsc$yOo zV8^P9=%t#h$a(C4M^%QC@_Yu8WA)2sEs2tEHCA(hOvSZrwzJF4K``x|R`U7Bg+`(x zt*Q{-mdI+i%cJ)kX2X=(p5?R!L7(2@M+VA=f=FEabSMDUdw*`~Bu&4sfpma=6>PI+ zxzG!(%FcVBrauWoET&zj6>3S*giDJW!ie^yY!@5A5qL8xV2=e}RHd!8Xzt&WB zA^Aa3BNbL4BJ)sBe);f^$jHYoV$_{VY9?7X0ES>#ag=AWA0D@9$PKi7ReQvx)VfT) z+~8gJ&TmA9uFwN$LxR1)P$JKd_8f~PFzEf?8YEykFMOxZM4eV3oi5v)}%RP{)8CTGD)- z-*%CuR8bGraTCMXAAT=FGNdsXngufIy4l8ke3g(Skl7B{CW8ii{Ffg@ABY5o2ISU2@ZAD*p*7$zdWBl5u=%sqiXvRa@r@yt6i&crpd1=t(nh4xJO?P{9i5! zh8z6w4?NXnq%9g6ik)SN;Q+F@Y{(CqZ>*L7(2)-*R}^0X$XNmU<-k$SQ~uYCw?w-GyAuVm%lxW& zN*$H<jX$d4^@{Vo9$ET#)E1IZ^r%$ZA#iVRuk;kezG?4km`wE} zPz^@$@6OaY`bf5#Qx0KoRyUi1r_RP{k($i+Z*faaWOdnoD<50 zOrj->JC>DKxm$ed_QeLc&p^-uG?l8$Az@+)Ed7sk&+JX|z;uc@;9HeuH>Yq zPVfElFJ*;)Q|tegiQ)f?PmD-_sX+n=;3j5r$HPc@J~%yLeDRmp=ku4`N&r>{{Xbtl z74qT-W+6hmt56cIbWobw*6Gv&7#OK@Fa^ceqZ+7lLe>pc7IO^+k#!Bp&BdWqfm#ux zBgMQmSM&7_laZ-u2C)8YO_k_Rdlu=p2$EtU^E&PL1KN-V(98^4?-a06Qw~UddTj;Z zCXRd4kAb*000%yt{{&^hbro~GK%I4u7n~qAJ-7Af)FJD-^(V}Fjnh&5gDFB3K;8J_ z{{Et+eHrDU^c2`i#DFHR*J*A@=z$;h)6ji#K4%O-1G%ESPB#XQ8y4@dATI$kzyR(O zU{``bjEsy7fI1I|h$Xw-7rh?@?vH|m5IrXW>FZAxXwbPxX^Y6*1|@L}L^NCA(;tl_ z&U7@pvn@p)gI35)t(~D}le?2!J0@2*0h8L#W+=EKSzuG)Seq?S%m@T_rAB53h7p~^ zUZxTZO;b=?X0L%wZP)Ctv^+ukDU;r|58Yu^&2305ZIa(fZ5WrvJ$|OGXi`o<0blw zJA0b>wY5*V7F?fITg`1ee4HsauHDW~fMust!>+Jwt55g0SKL4-)x8OH_H7YVVn?tR z!ePsUU~$tQt%pWTlGg^ndmz%+pu;lnFeI=Z&&5D{e?8Um0i2BcAwf`XRN5?(e|_?z zO@dI@NUJUi*hXIA6A~sgC&j$bUO8wu>`dfwxJ`lCp>;9B_>Jk8O(s2m?EC3rDD9EAsBf{?DFfp>D$yKIc7QJw0-NoLuD` zEU$-~#SAbiwyneEqj~=EU~?cLsNt}=L1%Qf+!$S}`lI=t-xVfFbHY;(4sfc$!K!n^G4L<-jr-hB8-}NW-29Z=mQt-muSoL= z8K3iS;Lft$EvkWs2m-Zo#5&0D**9MnP#9b|c>M^F~%q z&gzi&y+b!IVDln?HAN&Q7S_FxP<&}Q$-K6{9?;)#KB@f*yiftVsdK@a2+#=e(HRiA z7=UV0Wb*=e5CXtuJSw^Xt1eNM1UmDpp{Fx~8w-#J!ci zKEB7g17elh)gE*FTlY#;Z5!9pU;r@o|Fa}OKwvX0yFp|snPS|@x^u&NlFI_o`LP@5dN_>DOq8{ZkC)6vqeTIpwz;6nnigIHIM#(goht6_W!V99`T2MO8%6PI5CKT7ZZ zh+DeZc<$r-)0Bs$<1Pwp#_%8tucx3zA|9}jrCDKe3C`q8poMP)<$Cwv;2$9wmjEFxL(e(>b5o}WItU)$I~y3?((hO!lLfwEx_h~XQY_u(PHU4a1BNCGrN zjxSfkZ(WB$pZjQ{cv#r4eW(s?Zv_;*4NhaU$m+$h*(b1OwU=-GTNYbG<0-*-@bjz z%}(*UW}vxqZ4uM2wSC|3GPNElNlnD>YTMns;5=tlURpZb(tonvCl*8W(!eKeKh85u z%^w{79?-k(4Hvx5ZA-y5gDG2w7xA9Id%1o<>H`Whx407ya5_@?lp*$@$5_7$Of6CX zn@`KtinJb|9)t2zN>y@7$04*(DNCkX<=R}--oD&hZ`&$6GqamfHNP8#zc>uJH_Bn@ z%0$m)f0p*gj~`+&@^9b%C~3K`p9h-O`Euj0x4ZfejJho9-S+1@6F)%G7=2d*oPJb& zV0|^h$oSN}K%m&~P8OYjwfX^4lgqRRHp%Nk_@RSo;G#noL<*5;L_X{JLDxn4t?yZ= z_$cr`vkCMTgFHCQR)*lVlD^r*Xu?pfVsSFT@cA zyUAfRV>@u9=e|ulPzlVN3;;j(^bcTX^!k{5t7=Mb>>cQ_)(7g>Y5IoGDv||fl#BqI`e%W~3Ng|R$D-$pY zFsdJzd)7{YO37^U!w~4T0N2f3__1fUd`hwA)iLO6c5*Fx_>tH&J{AkaK+RivY6fZ- z&^Ew&{c#%S>_>M9Ju%d1dm`hN3Qht4=7&I%n_i4n(WHGJs9NS z$iOe&3J9|uI6H}gp2Sra6QZC?`4<5x)EpbVjb3;4{4-+;+We9wdQEMUAM}9t9GIXf zPOg5)3kFwKa@>Oc3DsfAd6XcR&z5($z}4ChH3G|s6Ra(mMK~T5M<-XCDc9_ZM5dryFm#<-O5Rw?J&Sf#Qk7?*KTGzX61QJW-$?UYi2; zz(!gadHnTpFz)bGx4<_uiaJ7kd^47m$jG#YB#<`Eil=}dEOi}p_bK@tw-z3w-F$X>!1sSN#O^~BiEbWcjr?lAxy<6 znj0XIjlW}k_Uzf(h#oKqKj`F< zWC0SH54(c}!j9L!j=$>?x~Bq9USRn8^=tcq`nJ?DI11tUI!IWgPs@eO&CToQ_(8kQ zga?)+Us2@j?R^}m1YfShvMC}V{mqo!zru9r0|;0UpvZE`{CS#htEoqal@t_wy2w9a zOzC?I0KEZzbyH3{y+)(!E8stVIvQA02rS?jke?jpxYo^ACIf@=G8eS_c+<}b6%L<( z${z&+I*W+lqm2lyPJmys<4GDS_%(B(06$h?F+lNfDdhojR=w440*PP1Is}>qd;`vN zCSNvOK`dgpEV$7PCh;LdfFl>r8a!+P^uGxbxBzb4 z<$#PPa{3nhBL;qz>XMk!Z`#~dk!xahYUhIK$acI+g2B;*`0G_D$9=uw?MX9YoZFCTT$yC5H?^|HpqWm3rjDSL^ zfY+_7%G@+4=^qmH%05U8H|DDrtR&bpA3x~o2_0mlov#)%CvocnOrdh3>wT6Qd$2y3 z1JVP5-fPKMsXyK;$($WP`SK0Ow~A^O+CUXTI&l;OgAiDRm7XTa(E-m@2G1dA^>>xN zZ~vT3S*TIgw&-b=3X+ro;MehoSgXE$>upvwP!sx8gdOO0Mz~-IX!=U-*)cyEAuWL& zjPgE~c2LaOg0WG=EjWurpse^ELcjzg!7HF5;KP>?ad+nhWFCQ=6bnWQU{q482IN_@ z>C!Z7!M8FpqJm7iZ?F^=550hE?D54X;OXe@?ndEzsM}0NuRjGWWl=PSh}Y32XU038#fWkHbbPs5vCDR0G_=*zvF21fm%- zzO+U10Gp&q0(39+e(>_RTn-X(F%$$|zK+|gQ`vnEy7<-Ts3?CJOaq4{(2?ed2F@31 zRy<$uywK%Nl4}I?YHK(Rf!uWo?i+>B!bAJp0>AH4YI37ff?b4{lIr(;MCuIQ*)Q619FYZ9hS+Gojf!BafaTas*>#7*kSUpY94Z>kkFUGjK zt=}yc17yxnra@Hm4tFuvmLQB2D+n-chOwxmB(m3ct_Aq&TA{?898+JjG2NKWK^11M z*19uaSHbUjUAe&vB5YJ=6M%c@&eKaUf#U4}fsI%MDnqAJGIMFrMC<=TklPtX#$;2w z9GJS@LzjY~Ik@MbBEtaddc#0E<<8c4Wl|r`AJAnP+-IQ0aV+6<-{u(`4@{Bv*0S?1X$MJ zA}669atdSUm^mcV=es}`YS?QCm}j5L!jW3%SMdTrdPsS0F8xaVGXMSMYP>nPjS1U$ zwNfZqeLDSnCa$O_c@6?}=oXI=Iv_r(HGv^KoSmo`D-b{96y+x*RT$l?#D$ z7m!YGHdp-uVCB|Bqa!k^uo$*P;dZ0z@rS+H zDs)gDnok?Yu<94jc(s6A2<&5fB9~L~&gup{DJB4bmA^-%1tx{|Lb`ySFRUVl1ufMx zc#F8#R$9Xu)>Mee?mG-1$jMamRZz76^)7>nH+CPicadWzpIrb}K$of40V-;u(bv4+ z1JDVPR714u>}f&L$FJ;%1)35=ap7GFLMzO(3?4nAW8Xt70(S>UY!|2qRW}?H+cY=p0WM1unX4VL*YC9Qts1gEb z3rv>iQ=GT~OF!^$RW@^H?3W!xtLvfOBsX$MC?2&UV4K}T7+!F35rW=bJE>nHC_! zg+@_vaYX7#Ly6pW@Sp%_2Tj9caH>84mUJ)YCBwwXDEj_=TAscRfN5I~I7%TQefC=V z5Zsf&t4VE}a~Cr<$F1R1mrR()9PnCSz~tZ+{FKeL+?v57FGMZ+0X#^O4KwwE=EypQ zN(Wth&Kn=zt&qv5M}S^<4tq@%sLNN_r#vary7O^f|6R_4$093G(s&ZGp&SnSU$E}N zH(r5)SEU6dM@JTnE0=shtXpw4E zf7I+A3j{%E0QzNA<^rev?60Ct-MH=7P{36N0^~FR=%dIf);l!B#hEJQ(0Ep;*F=mh zcu5H>!yDl#sHAt_-jPzk~5!ne;z}7-Mg(cW`0Vg-_yr z(U4R-Wq>kQf-2Gsl(lj3trGxE--Wk^q7Zsid2vS>$BmDV=bnOxJ?S(8Jqc9`9WCwh z-Nj-!_oO?2xo#I5h(v!CF*Z#05>5(VZ= z2D!bv5!~DoKv8saIw0FQig1|)Gdp1ru^GMUZpj&7kogomODdkzG7xt5V2<)}tB?%c z1vDiYSOx+KN)kZzZBp0e20&Rxvn#;5Ry#>-&K~w1c}D=&r5b0yi(A27(-INgJ+^b} z85+Wluk=!g(#vM9+C_Mw-%JW}<-=z|K8FnqVh%GO&}5TLO!p*s5^7sD({}<*pKw#E z)Frl=E`m0;lJ^`~P^9?NsUp<(b2K2c-rgKQaNT@^LV&3oZGf5h? z(*z~Kt2Mlbj1fFKIZAeRJTNhbKpH_kaS1w`pJQz1YhMLo5Pjx5Y{Ua;Ulb(BTbETq z&@Z|V^Q-)vHJNcIuBf8o|H}_qJ1Mkubaa%1?;}IsC2kh7CVZ;)VOAyRLZpE_dQXmu z0CnFjs`sn?%_nG|lN&&?l?s~!b6Uns%$zd)AFZ7EJJo3)$CV`7#>|MCI%1MJb)pO! z%TY)u6lP=$l`NxUDbBHP74jt0oUC;uJC)ri*-Kq9jO^S-a=`2(IG zo?lz8>wE6+{r%kU&+GlZKTAJx6$oBVU{ugnX`Dvf>=DUyF;Z`~JR=E3hsPV(RFuf=^|W?9Zy-NA#sCBc&@Bbq~8 z2ULeb6yY~mEPQ^3En20$d9ON}##kTtmz*A3Z1hWu9Z=WusEMe0q>HZA&%@wcVVeAHK-De5i zFqX^sCtsDuPuMz+!5vDO9k!2n;}6L6g`v17s4lgZfonQ06?`7d0gIBD^?^M=!W%sm zJ{RgMQMHlZ5XJV`(_Z~zuePU>0(bzYX*U3JPOqbViDYeH?Jq*tvH}d#&+n3#PlYUy zO_tH}J^7b`a*lK7RXRr7j7W9=a>_OwP3YC1EyaKDDYUZ_L=~*FuHts)+xB`t4Foym zNG6;PS@MFcWlg`WGH&8Ou*{1Dr0P$Npose&)V6=IA>=~9<$=jY+wmpOvFSU62mlIYaH!>JA}iUXaP-3emhX$xay_ki?AO>_#mJtGe#enkG`c#P4M{ukcH2>~JvXtm0vb^s(^i?xB-RXlRDFxH8h> zMDp@fC;<}(q9}BYA$L@#8UutX_oG!WoNk9vMoe}dP=ayj0ckH_1eZz9P)V$UIGnsitJu%ho#4rqNNvu+!6DeOH4?Jz~3KX z#uodkg)9d)MgA)@U|S^wWxr?HMZA*%m@n6?G?#8@PCdbhnFELcVr1YN&~(n3(N@;L zx%lcJ!PSiyFY)WIU?xqiflN>sVAM`3RSbt>H?6MN_uXaDi{w#XCaStvwx|<5iB_NH zYMmL7&D2OjKuFw={t@hkq+?|1!UP0&@9pTNZI;otVbW#80?~vFK^N?+5lm?=v>M2SPwu66shsxh4=-G}fE)6GaCC-H z6dW+2Ps@AamQAU9(ssIkiECHx?KL|I80Q8>JyQDAhDL5rdwcsce$gSE(`9bGYJQ8n z^M0c(vg%mbSNOokSQ_aca>`NGW+37!v`Ek?DILq!W-NeYjhlVnoB;QVjZT*hIu--G zMq}0t7R83-*6nS<04qoQsb1USpv;Oi^Hq{|kTooEkswR7-fWkY$B%zHXT8@lmyJZ# zuZG&$I7ZJL%~6_bbF4-lh3$y?O_kKYiC1Sf_e?1>_WPqzY!J#Cy+^37*V&E=CY*1h zml3G&YM+LzX_+BpXVGfArnfOHF1kanV#09%2b*B5wI@y(PYj7OUnfzFTx3%%zrPxu z?5h+VVea%jFoAkhJaZt%lXy6jtgI}?jr%Qt0MgCnkxwsCUVsJM7sx+$ZcSr*l_)k8 z8$)ql(?}uf{m2bJ01QIyPK|RGJSjtcvpo~r zcYwB(4bv&YWN`>5(J-ma&3Eac zS#8477(R6ZmbS9=_2bAQNWx#kY6q39hz+mW){<>a-|abb~`%y zYwz2ugxCH&s?JGF%n6uFRYfjtx9sXgY}`D*gM6fap4+%*QX}QCA6waOUX!m?Cp7BN zg|=I$2`SU*w%TZ>JW+9m@A^+bQ!_T%6*NqYF3!eS)Ou)0Dcql} zBcq>&J>X!^qt75q!W|~(C~$QX<<&V8@J?ZD)F&{Z{(v|++Bx1MpI~$4vasm3*K@_5 zWj41oeH2OKLtKPN1{WLW9I$}2y63Lwn3zuh!Gn0Vr-YiY#hrZKctqS6m{~(u5#RI; z{1J(YMmQMafL@{K;C3qR@gGwUT2!I<4c%nV-hM#Odv&H;4%%p6psxxt5gH^qvtbfevDM0+i`K30+m!~JWuS3tSp2##=8p=pmyWI zZ0*{OOiklSK;sTQ!27vJcjK%?e(VR|9+344R+)|6tU?$Y3AWgRDn93*rlwBg_sAX1 zprz(@i=dsJJ4D&|v&8#R7~I2fnls9hh*yMt(nx~(HI-cfW4`5jeUID{UE!!1ZX->u z{hn-)O9L+hK8|DOEGBI0tF+%R_qEJ>(t1T1R!c0pTEDWlvL8&)b98Wh(g%x94ecmz z1|J!Q_wpV8HDF6DYG33nQ^zVjDf8Wj4PI{PtqM3urq`|%^b=zht8%Sp*$WK{u>i@E z>zlOzhuHwaXR*BeXNHVu=qbQG>#!5q98M%~NjhYuV}7_T<-8E1cX7H}un8+lCc4}) zRZvz|Zh--aG{f7O-Kr!F0l`qjd~XU;^mN!$7F!#2(*Q0~`U5UJD<@!p;{Re^wphXBJ- z_oPcI&)Ef!r!?#AauX~;7*j%P@!7pY?}bGnCFzg`CEN~fq+D8CY!%P* z!D9!Ktnjmju}-XZG1nc+a7ww3!~rDlvk`LYws%A|?iq8nVypE|n3%+&0rz@N{YXvQ z^5awsRgK&W@qnNeLyJM7z=6XeR@=0>cIWRP7y8rE<(xFZTHsT<%Qq3BM5-q{R{`C*~ybarM(-e z@(2;xC`v^~Mk&IS>yyE|WO^l%2LB9OX2fwHWxOFg}ib#cRaI!xF1k&WzyuY>fx4qWlSjU7}_jQfy9OpR4Iqt8D@^7&*NHHJ~2=+T^31tWb;S~P!2o?OM zcYNU+_#d+AYq{4DNLd8ttpN&nOl>5sEC+$OGe97|Um%cc@GIX<2*l|n1hTCUfe8GB zK!|LU>Xn4RA5aZt-%3Cp;QyvI<^BM_LARCGbO6u5ga07>VK@F4V|_D%Y4U`)D-FCNiSU}{WSAYih{ z87RG0+L99!^UJOv+;SpI>~nkgNpH#f`yqw5=NOHB!LUUk@Y)KT| z+wFOi2IoD;Tx?Ulu!7t`Y%D?Z%%?ajZC)oxA8O zQBEum*drtd2j|fn{=Qdfw;Z z?iH;0+8pY3f4x&ue_?vDKWDHPF~3K;))s&n7=4kO>OGw7ywVl+X}l;N#>r2PGdHt0 zRv5QmA1w82AlLT1CU2)K%PUt(*o*^$$o7LljY23HNOM;S(24X|xA{i5KrhtFO3SI?$UXT~k-1Wbu26@lh5Sx5n>qqKJWU9a z03Kcx%FDF>{lSJ&)z)=ZG(wz+*YzeWL?u@~UU}ViIKj!YZxW^^{62yE_t4!~rfeLW z0ma3qA4y3?b)vtXvTALaj~AJp!){8aUCb+u{$UmWC$N~5Msl_KYZkmi)_UW1WEwvH z#;*v`TgE2gq+hIG>5kZuFEj@0q*T`e9!xZqXqi=g{P^*w8j;`ocuq-|x`7no!a7}> zI~5MYb4Qz~z?V7KZ-`Y0#5Wwhma>usoXkh%0yKwze(3IGUFhhLP!XZi3QZ8MJiH@e$#Fe~=`?LsjUs@M*fztknq(hy3NoMA6$rr2CtN zho@J~)>Gx#JvHc`CXNP@1)Xx`6ck<=`-Bb`X;%2AmN;w-qbN)?%~wg-sS3Xdrx2vorR37w6XcoZNYkEN?@#2JAUiT}5J*m#;n_x-ueCFJ z0j(d6Y^*{qG|C(%{SYB__G7-zfw8>29P77sNrmZPpc7W*Ckm>H>x>^~N3nwc=O~NL z^A&MD)NeOg6QZ(JyX1icD$O}v)OthiWMSQeWH5??8}2xF7+_LbgoSkx=gRl~yx z^%wsCX*>TP8!aY1U}LKJt3H#MhfbC6Dj|wDDZ*D1>fM)M)gQb!kSa)q2W##5(df#0ueVEUdjeF|m);Ft{c`WR-9c{42 zv(1%OHD_CGrrP{B{BG!kqi~^m-by}^7h6H(DhpOAH72R0MJnL3Z`pHC+8NqB5in)V zJ*-Ux-bhMKO-(h1nYhV_C@U)~&FA4hFq)ZMD(nashpQ{7)V^nh)#cwL0YuHueF;3W zh>vQCv)}z-$gxzHO%?HSjLSFd{8m3=o{d@k)1WJq#2{uW?`|y7dN}J{{fP6y{9NP; zm(9G;$o6FD2`lMEcb?~u@87Y0PZS*-f9huWcj-qyH9=va*$W9a)9fV(Yq`Jn-7y_V zGV5{n|JyJpdVl%GC7w;U@zdn}=Gkt=;PUC#2*QNL*bg;Z6gFILEc>Qf(Chlt@B(U} z+H7+6=GBVlH`K%NIs(zFl_#*F&oL5Y;<$z=q0p< z5=&b6d^3vgyA0;GoWvD$*$=&JMm1VJ;>e`z7g#tQfAesE7xn$S^6Cus2A94ng@qLt z56_b(kBjk`@jw4EZWWhv6pB^zm0O({6;iNj_W@jwBp*ywm^$TROBMDxYVtW1T_m9g z#g9~zb_Tn9UaiF){X(Pq*<^uNVc3b$e$2bgg&Wp)*(Zfkk?Rq{P0WqGcrqxex0}O; z#aJBs?Foz2nq#K>hEkIkP>j@yw+7r@SWib*DOK0?>j!Ht~+^?CdR>xa4FCCu59P#WBc*L0MV! z6(PiBci?g&m}kZc+B4rqY!AGmqkH4x=3sA+H8nvY=)5@q&)MSE*0B9kzuoC7%&o00 zyuq4Du7-For34;}ScAFo(9bXH6F+T@L|v6`uVR$VCb`md`eJ^?`{tRX|` zhO}rVK`C`hA3VFji1ppOcY&jCN)L{|Uqf59_y1KI*bPdFz-^24Oysrt)}Q!lM}{RE ztJWGMg#_bq89|5j_kBtHDlSmuKZ2~RaxU?0M_{2XV2?K@&A}OTU`X0C&rTF_D^EA( z^;gSY9tv!BvgbCz! zu52Bxvr2%}T!r+@Hv|JN(Q3`$=oL;iP{e$x)L;~Ey357IpKS-ny&|p% zkI-CrqBcG8srz3pcr50ovP{3E&Gbg9&wME-CJiFnQWkb~G`;)aSKHy{i+PU(v#Rhg zwKyK?MzFs1FIR{^Ws~t*{xsOA16f)J`FY~ZwrdG+j>^D4M^a;k=XtSiU0t1IbHDygLQ0CY zOni^d&Beh)vh#S6W>0VLNQ~N!j!uP1*gmK6$Bz<4))@gx3rZ%Q7m~v7C?VWLT*Kz^ z0!{_{l^~b=O|AynHE`?)3FZ^M_CV|rFH7xeOA@CIReO8;GC}qJyj;x+lcSUUf6Mqa zU{vmQNxTZA+}Qfu@*lv$Y)2KD0kWE~b0+_a)be^%KPw>T``&CF*YNN#B5dO{KdSRz zX6arhZIUo9MWkX=7g~^O`$wX40@QLG z?x&l+J5>W;)rz$Y&bG$_qh$~3CjYyW5<(05q1TouJ3-bRy#9L;F)fTB?R}(CmSMt3 zlcs*Si0x<4C&1^`{!MP{pGObM-sd@4(YWHRThYFdU6{UA4d&!s4lazEeaW%lfIuAk z_L-wTE3K>nc%n%bGBrdJuXJXtbyv&Z>#Z*xBmFsfET26_DLQo*>S&8pnwDgmu3VZY zi68Loo_)$C4Y_ zb9KdEh|H@uCw_|D8nD>5ju<6VnCCM;`f#@525JYG`q zm=j8cks3?SyAOuwkK{@jsjFs+AYl@*antJ^N6>ZRN#@@!%$c%5tgcx!N=FeA6(KaE ztuL}ks{eKCPHjRHdTl~WT}i!H$+FJTTujT2cRfVM4=RJsjJ(T>V&fAX zWI&Z4(6fM%5}ZMXB%l=in@Y&x*q7}MA-TYJv_zwBiWGQ%Iyc>J>mUG#Y!lyRXmog|v^( zj!fr~x{83hY8)($ExwF@!swy5J?M#YZA*tZ>nWy- zc+1|`Y;%9-oRFv)p7Oa3f1Sw5kK2&Xo#J^Tq4i?Iij^FsSik~X{g49JCT8z4J z=G-j2Oxk~|_ZEC8#QOaz$xGPlnj6-5ECaow6!9b;D^!1#)h9*azg#3Cmr5Es7TCaD z-ckqz11Te@#K#+3(F$k1Et!&E+J=T~6TN;$t*j4@t!&9K?FI9lnqGzeup-7<>#f4U z2_qx=V{*i~gRj3T(|HFUcZD+ZfnuKYeVRS1W;rsTd)!%l zCLBgG+y5a6s7h#dQMP=>_me?CiFtfy_O_RC*4=QN?j}O$EtQoR6^|tB4unFNt$7Y8 zBN+zs?;940P;v);5tPpTXj@%CYq&d(%N_xnJ}Zh}?~;!H~Q)_AtK5+zVkhj_LZ^KKR-S z%SMDD*t5U$Y>~+rY-)AsMJ_KV+~udY+a_0R#!{^M-Z~az^+}5=&+fxL$>Qu;tHH;w zp{cwT)G7y&uatu*H5KR775t#EU@Rfgsa7e$Gn+t(o#`?@qeB_CV2NM>L-Z{Z)F8 z2%UC~cs!UUPw3_uC{Kv$NzqdVb0$<5F;lVxuDY;^xs zd3J|gFTNoq`E9#MeU7$E++T*#nWOE`h--1S0s$L1U*;If)=GqCuNBamFO{xW`@v<9 zU~Nj$Kg2<^V)IpU6PmO|K(-Z9H@lCu-TvKEng0CeTE2tW4TAg&=t_cE=aU{`uJom2 ztCL%Td>zX1&YG0I=4X49Cvzu3>Q|%u<0lV0O^=5QZ^*ugVI>jYRwLQ?u-#d9=Xv4Q z6J-uC7Fz|57_*W~d5XScj*5={_~$-a6#ya4b629wu z6ouNe5D#xL)%{=6Ji~aeXYIDHpYpKK+hUSs`re~~VzRp1Z*X|jX+PcOt27lrS=`!O z+`H?yU%i5obZbK9iYK5}(+Go&%W*+Utmw1q>v8`4LQczOO9%C5)<5tMyoy^9oPsrJ zha(V#Q*G-_ztAOF>$;y{=k|t=-!nXWwgqc{HSgM9S|3b!u}VKOLfE5$Zi?lrfljh> zuU_!b^{$moM}4!+fvmox$K_j(2E@+1$#t6vN6`@C!K}YvhvML^w6GI=n6zW!m2(!$ z%+Ehny0^{aygQk9t0M&@0dU?`rS}gmDM;`WFIdDr`-T!k9&KmP*WR;cH?xs%XBR~7 z&m2ATzj@j~h%X+6t6bppy(D}T#kLERTHbKL#+<%pMyAIKixvr}#ZQz|cD9eYlH22ose^JbHsW_5Y=2qlsiA*!$$Mvp-~E||wsW`0*J9mnT{ z@a%f~8XBL*o>6 z5M;h0MJxN-LX!)N+aSyzf4h5!dt$E;qE8}AgbVC9D9ea-{poe#UH1Js?8_x(*o!bB zbcp92F0ZOw3T0M$#ChVY5=VFz+d!d6m>y1UinNG~i#b_-Qf2NE7Npy@TvyneFr5IM zMu@@;77}B|4Awy)L3$)fAt&FJmwbnlq|VZ(mSJs*D~SX6z@uNl(U+pP6X$;Ql{S4d%xHa(g?zh~Zd;EwUwN(0 z4w?wiqsegNs`TS5I)z#H0BxB{4d<) z?b#%Pgjq2~vrmn9|-56kGw ziYI!G^wuF5bK6>EZ;lV}E=u_Wng0AA*7Z21$LWN<--s*I1xl z+t&3llR-ql96^yAldrOr)gwms*H&}ZDhouJUCyfci!$002+2L>mzCd`kk^d-IKLv& zzTSHi=2~S_^&VFYi@Ns_lRBgpnJ0t!Dp0IyKfv$Rh4*vw6|p5ns@Hrhg@3i{QCD9# z`r-`Q*|ABTPNkhoX@M-b#RDOL>Y7}4`4uBtxS-MUh813lH zHo792OJ_dzN;D^;EhLWg5g!cF@hp!kK;YSI)a>wUVZE0Zp}3|hJ4?!52-!lT&6{7% zSzJ1Km=tu21itB16pmRMUKUGaVTuY!1kmfG#x__KWTx=zsK;|siiLi8|7F^+K`7EI z2z!}!)IgsLI#;c@c;4^3V`jBRBoM@57C-zk(6-5>@aLgP0p1P)vg1=@O*WrDe zrjpo4#A==I&rLT^}q+(dnj#8-sOpiJyKI3q-1>ug#F;j^c8 z&3(|bwI63facrARU)6BW+tn3s{YsojF38^huS z>TR5AO@ffY7*0>5hMlTgKOH7~S_M`{OW#nXhS>nm1^L#o1Pa`E{Aw=WmFJ7I1ROmL zYOUV#b2d>cl+5zUbRwwuZoGcoB?#Nk5are5ylIDn;0YfGU55hcc0)6`Fb;@__MVF?2hn+F$96F*Ik&P}HuPl*#kXx0REYF%Y z7n0ZUmWuH7gI=Sr)@=)9M^De;$gAtdLH8Q?$LyxFv2ArxKF(RaSr>Nhacy;$ z7iZ3tAE1?8IyOQ~boZE}WIwcrI=#VKmskQ-IY!it=5-;D-;^oJy#Op+62=6>(>pg3ISy|G9iGs3}fvtbjXkfTEp-=$j>pw zG&|nKzL?TZOul58(!gAGk2!Jg1MSGBb4Yri2PM3_5v7-SrpmhOiXvl z1a=-z_zKXe6}-mTWb@w)$|RC*8k@B`L(RYyHlSSu#fznsJ(iDZyE5N4I!I4G~u=T6FRs9T^avp`r z4Zn?n&4t5%=bLc%8J3W)PP1YEMT)os6eXkrzw}*CIpWmCOyu2TGMPb#jNKQEA2Y5! z=VPCxM?VECxnTOBO|YI@tIn<2QO#$8UM8+SOlTn%_oH0?mnK0W=YUl6^|-#R38m zAMYaASBy#L@wyZ3b1aWq8^Hdq_##5PF*?T(h2<$qQSrrasB!Y4zc{HvUhlK=>Rg#n zTGsh~hfGGi<110NDKninYQHiy9Hl~e3mqI=LH?+zt}CCXK7QpBMp*svYJPu;J)L*h zpLUE!Zv|Pa6G3zoD~>%N`+Bj?6)9~ z1`XQ5h&Z3w#`xAkR6RK!mvz&Fy+3cl7&r@gz20Kz>kng%`MgujC&bkTW%GZe%NxZW zV0-uWsm8PH+=WKp)*%+Z8gmb-Als6@pvP32~r!8pQ<$Ski_`{@jZCvr4b-bl~| zvgwgChcmsuYEdtk^8IjzY@&;%%DhARM6O_PY)_f?DZaDxSI`S)W>LL5&0o7!q#_Uv54|5B$#g{{eC*4Y&?+o_jz;RHawxm6BD9lldkG)P^qW% zD{K)OwW4;N%K8#14oyOAOW)T^QayMlomgm)0$mK}BfHPrVEidNZvwV@-kuTT2X3>2 z>jg9WP+?<7kwa_cN^3$0A`V(3>W|+(XJortZ=}V<+ZaYe>~nFqAERHCprZ$?;2+B% z%y6J**Nd&E5qD(s+u8Y2oI^2^)G?^l_iWg#VB-fciqh9@s8tb79+Bkz<>)%igZu8f z`_bD_4+JN*`WqR9!4Ig@s`f2goCBbQaRW>NZxKg+Uo2aiTJ6y(>tpaAxt+`l!N)~C z_>=Lhc0xpaOSQAmUOh{Ph2Me5$Gfd0L1O#Q)Q3LM18EQaY~o8KKH#JB4Gd!ZNUP&d z`S@R;^3gB7VE46j)oN<+ud{WsP@ztH)cO=DS^@Hh2_+?jZh;OFfiFo6reYLs7HUz8e;IR|?jH{T2>VClDSd}H8E1{brkkV)?L*E4{O9`~zZrP{V*}HO% z^h@gD1FM8;iv}aMyMooWQ!MK2tYF6d*jSKpUfh=e|M{Vh(O*;IYPjNW??Gs&p@UTh z1h{VIia{0`#DmgyDf%$p=ikDJE=$8(SJp7CAH%5d5&jqvZHL$D{(xytC&4zBoz?w4 z2OpE8+S9g|DUnD0I!3!7PFByqqKrX;{Fy<1I*J+y#dJzgc2Nv!oP8>yAa2s`(ZQ$g zmW8OJDW%^l2dd?J63qaM!v^B00}e!gKBcH~of@8soDD3g1Lv?^_nex>nCBnbfEIwo zT%o%+UDZCEElby2@|VHKh%-nPX|w$;eX~f`e2V();OHDz%j>;)2AvybOT=Ls16e{1 zJAbiWjjCkbceln=MKfC5DMV6E+Fa%D-FthtRNkoLi*`$Nsx|ZN#nYR}@c0d9kN!3g z3On)b9Z5h;(L;33ANYK%%9CciyJmVTp?Z5%@m{rWwZ+;_I*rq}yAV=}-cgTOb93%~ z4>R2#-=d{-&B;iR#j*(@&_o5fgTurDWtD9W#j?!z&F=}}zOm%JV0av~{WH$?-AP6cy`#y5?-NTPjuC%s;|KJDGuT$IC0#&{r5Gs*%7J!?>cPExz560iF z!M8q`YGdF3MK?#x>Fi>`ClPuYdGU6q_J>n4ze87~=VK}n%V`l5fx!qW(eOVpEQx9` z#a_%qhy0+m9EGv(2?^goy@#e#^5F>(^M8THt)tCMsF`-y?l~UQ0ccwH3Cx8iWW;_e z0aCpAUjb8PW#u8zWr3QtD;27-0%Mkhr%!0dpz+6l^#AIV1qS8Bgc`48~g;n0&T)dT$k!d~C+Bo{)RPG9!cI%*YgShJ$e*yx!pERXHS7!B+sHjilRX-kvAP! zEb33jpU2HRFbE4%ob61!%3?d!s9h;#VmFg__csSQ z(fNFw+c&j*6`*qq_kkqZ)Ee^|HhA5fcM|D&rh7C5p=b5E32RCpTR5!S#=L7$Dw z(x-A*tw0q$S3Y?-#)ezo#$ueiLTk-xvNWA}jdNQF^gp@bE-vPZ`ITn#vFCG62IKrj zQgJn9M%{+s^6IOn>Ksh7va_Ftv~gtpr^jDK>9{9iq57*##DEru#d*Jz5=8ri@-X%x^iv^1R3U8dWe_om}Hv$K`X zsKP%b;iv%d->`5*Z+MuzSeJ1wNF`hetUwQ zNXbb`#03In#aazYT-FaZLvoJaVEu?AqwiOa0#9aRg-Ji>+N9*aT~{VM1n46?TaM=o z`ghQ(VN~r(c&Nfn2~GXLCydhPveXt(-+S6cW<%^eTUA|H)d#Ga6>OigA8*tqDiQtq zqB1Wwll00aW#1~CQg}LYMfYd@Bl>60o)tNC<#oQ0iq2Or(N(G|F=4U$j|cY~Ae8@S zL+(iKx(cXve0P8q*uwcpoUJ03?rk`6`5Z{)b8Esr_nu!Y7(Kx=fa7{7?e*)1kMXY$ z_>H2gEG81lOS&Vd-md+Lp-ZtbG0E9K#vy(Q33sFmh22kEllUDRv&V)rBr*HXw61WdM06_H-Ak`0JUm0MVYYnafk|A- zfAWNgWbIS!=nntMMXLdeX@~--gKrBB!lA(WU6aLZ?Uepu-d6hwSZuAC*(wWljWz63 z5`OR7+I>&B^KtY8A#d^B6)+89Pp$v{!I%l!GXn0XOa*Gi=F=jQtnUJjZ%+ngAqa7{ zoBb}^qxlJD{;cl3g!0W=^R6q{D%BRFWth3|u}Qff6|!a6p??I9b0s&*#3Q#?<_#f4 z?7VlEZ+i`m|E0yT)mK*<7`ua_IT!J9xQ@fRI9rbYumr}ahv14|7{=;%s~zBnRsInK zfZo578B=ZC8(UvPHsF^2A6wPFJLnv%wH`a}PAUPbo96fL-{14I%RK)lU)BGNHuM4m zw~0C}orDEZD9Cl!UU$GslBe6`-s;HSd}$aJ_ZyI9$IT&{_G+_Lj+dXu?}43K3gm#G z$2;;CqxY6m<(-jMfkwYRqre?3aFR0OhlGa3qR#C--_P)|QVOd{u*287Rwm~85^!3> zPdbHmlQBFC9s#yMl#HoB7#;{}}z}*TIO!(TIX5NwtE> zP{CVPV0q)EUjV}u8Nk&OxH||&C!974Cnn2`%D~FgF2Ixk7TWxAt_t4)t8UxRGqL&S z0-zwTv5(A)ikp5((zeYY9D-}vz#rp1-kVZ;C9&{+o3fW$s{1yx$~9qP)lUOp%#WQ; z1!mndEs$%rHr^_Ezlv4;x6$jp**OVp5FECPVomw1fzIcbA7&wt&&qaSi?&)-@=BPfMmnhuad%>Y3u)?~{(@6NLh z`0F}A%nTfgnHCB24#l-A|N0}>jH>pr^7Hc%CMfu9TX&bAY~4#4HUHIMDE0(4*Bn8; zpmwF*ZCcXatQfd0SdRIJW>K{$9t|t1SgSEGeVY)mXB`K6xVHVC>9HrN68*m;EpxlA zNMQW?&!3;9wQ z8|ltj(C420Uqig4ZjM%!ISudut2ax@aalx^b0;q z*DfM1UVsHKonCGimK=_$>lt*1Q$T!YXLUj;1jmQ=n(xkMK24U=P`WN6Jfd-2I|6OU z3|hO}OS`KM0)-w@9`hdiwLiZb_UmQY^qOaP4X=)CtOIWmc|2Wa6r>;muElH8I0<;&7Y<6>UVzhlvRdJ^ zqh?ky)i@3g?(_k#p68KdYNHxV$E=5gTCY+3@#46)O(!ro@1I;Zd)?UXRZS#7g}y?IRMhK7ebB`xrYla~#_ zBJ*AsP@$XM3f&TPno8hwKrU#mXH;7wR5Is0V+AS(tDc#KG9$Em(9{wOtY~Ik^Fc;v8cg z^73O(WMnmb>LiqetLvaM8W*uxyQa&cq$#lBpjj{rK7R5=DO1V-kPL*u61bxtz$3AU zXYE2adgtej4kZq}@Oo8`+`109=XZ|5$vx9bk~fXoP)gz>$AO0};dUdu z7Fh!*=48{m=`bp-=X2-OT0RQ~76YwZK&_8gSRwtw&CM-g4GPT2mS9mADpS4AIE6si^l(TA8O3&N(vZiE%nKIq2=W0cpn(8kHZ);}fwkJvs&QgGe$p@nCfnwrN;K~!v`_ZT#*fO@h&kwj0hadxiu1T|UqoHe_n7dYxw_HgTN@`{w9 z7<&%FUB_2~`et9+faYP<&PsC$-mu!2`s61b;-cfRYiZp?@c4FYQ_=j9OJ3D(|s|UGBin+RG zR<{045RRlIW#?~D{=NkBbg2_$Jmz1}C|x1^{QT1I-upyHt~sB#rj z&#!L^3SrMx>yK8tjleMJWQFNtNE%rF&B-!4xMQ+pWB1jZBLS#igMe0L1khWf*^?jO z2RdYPtdMBB+G^+3L!6#B38^$ayym0kA>?LShHlG^epKu!KVurV5tR zmFVg^c9O{EEuVmczq_+D9Z;_H58@n_kL)fFm-2ct`K}JzAEz^Yo3H?e{%6u$*iaT9n69KPq0f&R*(M-ap+P&%-FqC1Q#Any$ z;Mp6^><{X-mV?2*zEd|=8X5%WhPe$V7fN(=bdep5<`&72r_-9t{4&U<`HJC_m*?$Kcglke5W5z9n_Uic-zV|? z-8fUumN5XXl+E#CGI098z)dt@62-rL>Ck(O zFsA80XaU~;1la-dX|A3JR=@ome%&WpzXC;;p38510<#H2VC`vV=H*_^eF5i_tUe4B zQ?xWR>58J?Evtu6M~c*nNkO@@e&qp-INl4dK)_*9iOlX)0Z69=2zX*1?6N=0A4<%D z2=aso7&$5fV*+Wc=M@zdclR1h(uD|y*4AwH4i0yyozkR0fm9&*f(r~XC+3&D;LT=j z+p$H8&*94OR|3ZC(ASE<_X9L;_RDV3`=zTCvX}ah|72LVmZL7RqgJHHm%@~g!H*WV7UxmJ5N-BA#pvOJ`@W-Y-;qzTQ zm{TjVNR&#=d^QGvkS&qhjCKK}BR6nrBZpz2${NpCc{>jl+a82+PV@u7!jr8DXwG|* z)cYOn8tWJ^IeG4`7e>mn3i1=rNz2uGBHg*CH<&d%2I=jQU@DkKyov^Mp|W7UV|t?r z1fgQ9*NJ*;z0(e==L1+_WB7}K#Qm8v&ZIvfU`&dJRAV2bDJytgdmrS04se#rOb01H znwVsOQR6(7TpX>+Pkul&f9t5NECT=$ac83Bt+O*P*pxtk0N1DLP6Ejyb3tI`y#jY; z!Bk>6IsfvR7La+d^BL**lI1ODYwDYBX$pe9Z#l@$rveSo5QM!*$-!h<<|P)?;+!3$ zDPs>qSWs~0;0EY~d3DJsm`^X|)JtWhK`~@GRuEI9*V5d${Ea0GH)E(J{Ne7v=k1Hf ztl+tk7jrIpt!%WsiE^O%p#;;alDXgjGafCbci{Na+SD$grd|jg_t1HtuuLv%JX&%J zh)YalIjG-ZOT7g_P_RS(ynw|qcZ8Yfg$8wl(+&fRY98((@w6o`T;HyPYi(yGXC%R= zN6$a)&(?9Wu?;YKT9BBWbEDD-4&m>09S8ZXTL@d(F7G9KdArW zqoVM*=K${9g_~ReAV+!sBPM3;;!oM)#T#!THl0W?oO-0SK9IZ<)2vfxue*ckZNey@ z#59=1Psa`>kZc7}N@5EEZ`%}zR{jGJ`QO(_TXipmM7;j9eDAbGti-NHY?io zr2iFY@jp)8CEia=l*>(tM*f{ZmmWU!hry~(?AEOb}d%hcFt)c9q25z zAarhZc?J@AFbNpmA8L1T8vjWX55Uk3x#6oFgF$C3yj}ya1;2UHDD^p{61@DXaU4vy z_gjtUDYYL!MSQ{_Z=QUDQ2SuxWj?W~Q_*14sr3cD1_Q9r0rGU&9pDlofBf(VsW_;z z2|%AANCpW6>d4pjAk68Wvg?8(1k^*J&p#AU15a*ll>St?F^WAb1Ieo)5v_4HjGdAie-` zP;Y4v@={YlS5QxV4vbzAg6YwVt(c{1AVm-IH+f#!mpB>!iT(xZuI(#9WzqdNO9$Oh z1BPJ`3*m#0bET0_#lrL~K>4-mlu3jnu*HxqQKH)>|dMtYTG7yJi+X>A8lv}kMDIT8lV3ObLg+^)XK}Gu~Tmk}ru)__zEZEi~kkbY?&OVF!g1a}|IUg0Mm!u5hR)grg=$nt#yQf6- z13YeSgQw}P|Aghzh)U6i`)T6FhQ1g(FUSuYV~ZaFet0)TpKg!!=BBFyl0X;x)*GNI zYyqYZFLZqFPpB$w7AWCW4bWiWGrC5nn}0?0J_AaL&72lN%JXN#JOkvV+Vunr_|zgj zJ$)Jg2k#NJLN#n*kMj;tL>AYDfn#C>f+iuXDB~Br>KPQd=^N=Bu&&7jfxS7JPp~~+ z98zxFy9~+?ctkY9x@ON079zlR85nx)a7qrpH^kCfoL(2uC%w9`A)|hBpf}U z%BL(jMMRnvWzEgaTW>Rqm2_UCbQ?Rfr#tdvGDd*P?b^zBEJu#a4J6$bGjLp2UiE{a zZE*qA{cMo0M2y%3$#MGa(Gr!*fo69M6vhNMAao^RN*Fxbi$C^q4|ml?T-ge9JXZ zL^RGj3<_VkQrv**Mr$5aLFFJ!;00AI;GmVBK-^dpJZPi?8HSmNRf`@_CKi{y>1QDE z@9~@-!n5(%-7&xd?8#zt&;qG%h+m_+b^7XjZLydZaK${&6 zq=oZDAJ8d8%K7?HjD7b=zVV0Gw$n9+D# z2*`p?gLCojL`mwx-dK^Q3MGh3#f@B1Kqq zbhNnW4OrC9%m|ThKuYYtVAX9ThAU9uxF9u~f*j#}b8xXeChGzXY`3l=&eTu?cEvD{5^Ra?Ua9R(+f-Hk_4k7J)#2d&<@alt(m-i{)trBW#v5frys;90N%*gSscvQu0W z=!k_O81f@}dv6_xgHNuL08I}Ua@eSl)GQC;wd1#7O-b+n=IJ>-bRj3E^ z5AMZ4hoZ4^`ThNw$PBASs(Zl5V_{+8xq~`R@7v2XGtiF6FKxM*MGT9b0v)E{R3u41 z^-aQZfRHT&^6rRuv!^Fu;Oz&{y0?m8w?V;()YQ&v`XxtST^Ns3B@7E7j)11=`ge8xAe_swJBkIr@>*?=}maJPsR54Ss= z?`neTw(X#PQ1pRZHulBQjIsa_2tkc=y2W@iEX#g{l`xX_8VR(M15{zsDVf0AbvfvB z?+sV;^3}DN+Rl&?;J-w|UlF zk_j=7(uBRTo(%>g&93nBZ<@&%H4O!~cJ!TxmR%YadpMM9LCnskBLw zEGOR55Jhy3ifUR8Iw>ilQW(q3bR1Dg4sDb*%c&T&ScZm!ti?en%UDJTjh$h}yw}tF z<^A~ne(z`VGxI$6egFU0|GKXG@=ANh`>M=heU0-Qvozw5lmv%`l?{DS6q?C8Q^uEE8NCZFP zjSf_3U;Xi;IT)fn0-@h%%HZgT2WH2c`#Da zoK~Ld&%w(CL9^a ze`z*qkH`jhge_e@o>S6QL~zf7B!M7PNRti0C(JXELPBvpV5&f=g>^M_7 zF2UkJeB`=1zml?(c>ODsl?NMi8~vFEr${U2slyJG-uoC0ZZ*3QWH)yERrKsmU6S}wB3vveZ?P9LVBuc6& z?rddXep=zOJAY*99@Flg9)V{}E~Fy1*g3a^ol86<8%6fHoQ|j>S_rz!6h#1uni@xr zE^{D9y?nWisEy!x z;vwhDXqR9a{WFeNKhzF~KZP#_+5yi|P+gn75V_->?uU%Fo`z zP~}ASIm;sbdGnM-bijAA$7v#RZ+{GGr8}v z1O1!I%F7+$2c(vlZ@IgwPISb;WT6O4ZfP!lMG<$9Q80F=_HrV|iFlYGNOCIj$Ky3E zY3c?ulhrPUrw_@nV=CFRosd>i0QzlMw zu)FX+*?#nK^lM0bB)ip;*8DE6G&yY+f;gz)C~D$<_k+aVH%0^6m{3HeJB}3k z+~DEsZAqi0a@lxod&T7?c4mgM)Q&DVp!SC!KGjQ*Nd~Sh>kz0jPIpWWim`~_yIQ0I zk5-BFtqO=NRhTHM89d9kW7waq2Cj(-pytX{Nb zEg|$bV)&qNDr9(w->Zbl#FE**roK}fmE=z_)hRVqRa>(?UgKX<#|eqG7foEfp`oD{ zYtjoE?mP?w`qi}V(%Zp}wA^w{dFxbLEE5^Uj8#`|xkPOaf(I5`HA2_5C9{~DH-;@n zDRc)4CUI9oFS=0Jaq~P}K3h?ThMLl2*#1fgDdMw*^Xf#4Vi+muJ9mzE02cA0t^$)r z&#nDfr0WK*Wn_2%k)MAK^&3cj$U&GU2NrGjNst;e z-SY=FqeT96@~!L1$M^1adRYhJDJ(cobd*GWM1X1=_}6|gQ_)1|qtdb(cK^lVg+B3F zc>*nL4Bd_4P@4gW58BO1rO6$01!dkzGGA{}F!jYHzgn@%28}l^B01E^0`{%7S=oxI zbn5KHMVOqtYr{?Vz&nJVQK+k>^}(e(@-U~jw-S>ykJFB79w$>x=t1M}AcTB)W$$jn z0%2st0HAM94gEf@6D^t_Wn=xs@W^!5L=M}=Di7=kOK$Ig9skow{cf#kk$f+12Bq~) zr-%aGCnN{TtJ>uYa5#8FW-!~%{$Rik#i?T*<}TBBpyX0Y%gPAlF51!A<%oP4cf9-n zyvVui_XY_NEM>&7?Pq3Y=-fQv{9MTE8#IiCer~^s$vJn7IwJ^)f^0oWf;_p@n06C) z6c?!kbU3~0f+@`$e$*m!Ya1&+p%2`d5mngazfF8;7EZLws0S zRaYUi!Q9(zV7Q%0CQY?CQZG22%DwViL|hU<0Hc#jj&*v$Zke(#x{+gf{?^1zZ6Hb~VtMVVI{zQZnN=wHdWB>s!Ko8eo(B${8+bq{wTMwJ)6d4OoNN`P9!&ZCJe;XIR|c+KXEB}@pP zTHu#M%=Yat`Fy3+LNV{34q|KNv~}BBr_<*_K!|B2tuT!>rjgDRDg@ELzXc0SLF*N7 zs|ABp2}(`uL+UfJ>uTqtq&X`4r@ps`Kyh9PLrDMWP@GO`?L(idA z^85FK^|;#i)JsXXaR97#CLUVF$a@6=CrwQk5=SBBml!cufA@WB=wEWEU=3y;$n3%;~mAz-ruFoi(I@N|2RF-jQ7J%*_FrlVl+U#eRasy4+Duna)|ujk zjO(a>9H|OE~tBYexZ`H>)#Shtp2J+6-U7U39Je8)<}3DKTvf)ZK3|bW)p- z;U(dfzuypUl<2$uK0wEMc-0;JC+|0hUgm*Dkt2dgi@L7q>FU-M`g%c=S%bAS_wm_P z^-!C8Qaia62j_-lJw6Ewx1>JfU_dt#ut*ogjU1rcmM-5sif);fLCi+CoEx8ESgAlHq zbs6mPa?q$H7%nrf^;*@IZfEnBrpmyOO_yS_A#To}@ z=q}~DYH@) zF48-@ps>70@50in>tC#YR`C{hIXsDlIh#~vsc{vX&dfY;!`9&cI2~J-|5u#s|Cl=a fe}Ak~xL{H?;ozUKyk?|{i&*Zr-j`u|=J$UCYpjua From 947c4da11b3be091d123577f1cf35bf156de9528 Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Mon, 6 Nov 2023 16:33:01 +0800 Subject: [PATCH 12/44] [feature]Optimize reader syntax sugar and Improve basic usage examples. --- fair/assets/fair_core/fair_core.js | 10 + .../assets/plugin/fair_provider_plugin.js | 2 +- .../assets/fair/lib_ui_counter_page.fair.js | 4 + .../assets/fair/lib_ui_counter_page.fair.json | 106 +++ .../fair/lib_ui_counter_page.fair.metadata | 7 + .../fair/lib_ui_counter_page_provider.fair.js | 19 - .../lib_ui_counter_page_provider.fair.json | 206 ----- ...lib_ui_counter_page_provider.fair.metadata | 7 - .../assets/fair/lib_ui_example_page.fair.js | 11 + .../assets/fair/lib_ui_example_page.fair.json | 867 ++++++++++++++++++ .../fair/lib_ui_example_page.fair.metadata | 7 + .../assets/fair/lib_ui_example_page2.fair.js | 1 + .../fair/lib_ui_example_page2.fair.json | 97 ++ .../fair/lib_ui_example_page2.fair.metadata | 7 + .../example/lib/entity/counter_model.dart | 11 +- .../example/lib/entity/example_model.dart | 14 + .../example/lib/entity/login_model.dart | 8 - .../example/lib/entity/top_model.dart | 6 + fair_provider/example/lib/main.dart | 60 +- .../example/lib/ui/counter_page.dart | 69 ++ .../example/lib/ui/counter_page_provider.dart | 114 --- .../example/lib/ui/example_page.dart | 376 ++++++++ .../example/lib/ui/example_page2.dart | 61 ++ fair_provider/example/pubspec.lock | 2 +- fair_provider/example/pubspec.yaml | 1 + fair_provider/lib/fair_provider.dart | 2 +- fair_provider/lib/src/fair_app_module.dart | 46 - fair_provider/lib/src/fair_provider_core.dart | 168 +++- .../lib/src/fair_provider_module.dart | 90 ++ .../src/provider_dynamic_widget_builder.dart | 10 +- fair_provider/lib/src/utils/time_record.dart | 10 +- fair_provider/pubspec.lock | 12 +- fair_provider/pubspec.yaml | 3 +- 33 files changed, 1954 insertions(+), 460 deletions(-) create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page.fair.js create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page.fair.json create mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata delete mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js delete mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json delete mode 100644 fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page.fair.js create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page.fair.json create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page2.fair.js create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page2.fair.json create mode 100644 fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata create mode 100644 fair_provider/example/lib/entity/example_model.dart delete mode 100644 fair_provider/example/lib/entity/login_model.dart create mode 100644 fair_provider/example/lib/entity/top_model.dart create mode 100644 fair_provider/example/lib/ui/counter_page.dart delete mode 100644 fair_provider/example/lib/ui/counter_page_provider.dart create mode 100644 fair_provider/example/lib/ui/example_page.dart create mode 100644 fair_provider/example/lib/ui/example_page2.dart delete mode 100644 fair_provider/lib/src/fair_app_module.dart create mode 100644 fair_provider/lib/src/fair_provider_module.dart diff --git a/fair/assets/fair_core/fair_core.js b/fair/assets/fair_core/fair_core.js index 1ac1ee44..ed4d3202 100644 --- a/fair/assets/fair_core/fair_core.js +++ b/fair/assets/fair_core/fair_core.js @@ -64,6 +64,16 @@ function _invokeMethod(par) { const value = args[key]; if (typeof value === 'object') { invokeMethodArgsInterceptorManager.handle(value) + //入参被压缩为数组时,确保数组内所有元素经拦截器处理 + const innerArgs = value; + for (let innerKey in innerArgs) { + if (innerArgs.hasOwnProperty(innerKey)) { + const innerValue = innerArgs[innerKey]; + if (typeof innerValue === 'object') { + invokeMethodArgsInterceptorManager.handle(innerValue) + } + } + } } } } diff --git a/fair_provider/assets/plugin/fair_provider_plugin.js b/fair_provider/assets/plugin/fair_provider_plugin.js index 3f84671a..bfe51ea4 100644 --- a/fair_provider/assets/plugin/fair_provider_plugin.js +++ b/fair_provider/assets/plugin/fair_provider_plugin.js @@ -10,7 +10,7 @@ let FairProviderPlugin = class FairProviderPlugin { } catch (e) { fairChangeNotifier = {} } - console.log("miseryy 创建model key = " + key) + console.log(fairChangeNotifier) FairChangeNotifierPool[key] = fairChangeNotifier; fairChangeNotifier.fairRuntimeTypeKey = key; fairChangeNotifier.notify = function () { diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.js b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.js new file mode 100644 index 00000000..52efba09 --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.js @@ -0,0 +1,4 @@ +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _CounterPageState(){const inner=_CounterPageState.__inner__;if(this==__global__){return new _CounterPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_CounterPageState.prototype.ctor.apply(this,args);return this;}}_CounterPageState.__inner__=function inner(){this.counterModelJson=`{ + "count":22 +} + `;};_CounterPageState.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_incrementCounter:function _incrementCounter(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let counterModel=context.read("CounterModel");counterModel.count++;counterModel.notify();}}},};_CounterPageState.prototype.ctor=function(){};;return _CounterPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json new file mode 100644 index 00000000..727f5217 --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json @@ -0,0 +1,106 @@ +{ + "className": "FairChangeNotifierProvider", + "na": { + "initialJson": "^(counterModelJson)", + "child": { + "className": "Scaffold", + "na": { + "appBar": { + "className": "AppBar", + "na": { + "title": { + "className": "Text", + "pa": [ + "计数器示例" + ] + } + } + }, + "body": { + "className": "Center", + "na": { + "child": { + "className": "Column", + "na": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Text", + "pa": [ + "You have pushed the button this many times:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "count" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "CounterModel" + ] + } + ] + } + } + } + }, + "floatingActionButton": { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "FloatingActionButton", + "na": { + "onPressed": "@(_incrementCounter(^(context)))", + "tooltip": "Increment", + "child": { + "className": "Icon", + "pa": [ + "#(Icons.add)" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + } + } + }, + "typeArgumentList": [ + "CounterModel" + ], + "methodMap": {}, + "digest": "61dcca0ca25598d884689e6aa5679d0f" +} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata new file mode 100644 index 00000000..99cacf8c --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata @@ -0,0 +1,7 @@ +# Generated by Fair on 2023-11-06 16:28:36.272460. + +source: example|lib/ui/counter_page.dart +md5: 90013183bf2a75597cb7644ab4e97676 +json: example|build/fair/lib_ui_counter_page.fair.json +bin: example|build/fair/lib_ui_counter_page.fair.bin +date: 2023-11-06 16:28:36.272763 diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js deleted file mode 100644 index 2f3a565b..00000000 --- a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.js +++ /dev/null @@ -1,19 +0,0 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _CounterPageProviderState(){const inner=_CounterPageProviderState.__inner__;if(this==__global__){return new _CounterPageProviderState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_CounterPageProviderState.prototype.ctor.apply(this,args);return this;}}_CounterPageProviderState.__inner__=function inner(){this.title="我是写在js侧的title";this.counterModelJson=`{ - "count":22, - "testName":"zzzzzz", - "someModel":{ - "a":"ffffff" - } -} - `;this.loginModelJson=` { - "account":"qwerty12345", - "password":"zxcv54321" -} - `;this.counterModelJson2=`{ - "count":333, - "testName":"testName的初始值", - "someModel":{ - "a":"someModel中a的初始值" - } -} - `;};_CounterPageProviderState.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_incrementCounter:function _incrementCounter(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let counterModel=context.read("CounterModel");counterModel.count++;counterModel.testName="及哦飞机佛IE我房间";counterModel.someModel.a="hahahaha";counterModel.notify();}}},};_CounterPageProviderState.prototype.ctor=function(){};;return _CounterPageProviderState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json deleted file mode 100644 index 41f7932f..00000000 --- a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.json +++ /dev/null @@ -1,206 +0,0 @@ -{ - "className": "FairChangeNotifierProvider", - "na": { - "initialJson": "^(counterModelJson)", - "child": { - "className": "FairChangeNotifierProvider", - "na": { - "initialJson": "^(loginModelJson)", - "child": { - "className": "FairChangeNotifierProvider", - "na": { - "initialJson": "^(counterModelJson2)", - "child": { - "className": "Scaffold", - "na": { - "appBar": { - "className": "AppBar", - "na": { - "title": { - "className": "Text", - "pa": [ - "^(title)" - ] - } - } - }, - "body": { - "className": "Center", - "na": { - "child": { - "className": "Column", - "na": { - "mainAxisAlignment": "#(MainAxisAlignment.center)", - "children": [ - { - "className": "Text", - "pa": [ - "You have pushed the button this many times:" - ] - }, - { - "className": "FairConsumer", - "na": { - "builder": { - "className": "FairSugarProvider.consumerBuilder", - "pa": [ - { - "className": "Text", - "pa": [ - { - "className": "FairSugarProvider.anyToString", - "pa": [ - { - "className": "FairSugarProvider.valueReader", - "pa": [ - "^(value)", - "count" - ] - } - ] - } - ], - "functionParameters": { - "pa": [ - "context", - "value", - "child" - ] - } - } - ] - } - }, - "typeArgumentList": [ - "CounterModel" - ] - }, - { - "className": "FairConsumer", - "na": { - "builder": { - "className": "FairSugarProvider.consumerBuilder", - "pa": [ - { - "className": "Text", - "pa": [ - { - "className": "FairSugarProvider.stringValueReader", - "pa": [ - "^(value)", - "testName" - ] - } - ], - "functionParameters": { - "pa": [ - "context", - "value", - "child" - ] - } - } - ] - } - }, - "typeArgumentList": [ - "CounterModel" - ] - }, - { - "className": "FairSelector", - "na": { - "builder": { - "className": "FairSugarProvider.selectorBuilder", - "pa": [ - { - "className": "Text", - "pa": [ - "^(value)" - ], - "functionParameters": { - "pa": [ - "context", - "value", - "child" - ] - } - } - ] - }, - "selector": { - "className": "FairSugarProvider.selector", - "pa": [ - { - "className": "FairSugarProvider.evaluationToString", - "pa": [ - "^(value)", - "someModel.a" - ], - "functionParameters": { - "pa": [ - "context", - "value" - ] - } - } - ] - } - }, - "typeArgumentList": [ - "CounterModel", - "String" - ] - } - ] - } - } - } - }, - "floatingActionButton": { - "className": "FairContextBuilder", - "na": { - "builder": { - "className": "FairSugarProvider.widgetBuilder", - "pa": [ - { - "className": "FloatingActionButton", - "na": { - "onPressed": "@(_incrementCounter(^(context)))", - "tooltip": "Increment", - "child": { - "className": "Icon", - "pa": [ - "#(Icons.add)" - ] - } - }, - "functionParameters": { - "pa": [ - "context" - ] - } - } - ] - } - } - } - } - } - }, - "typeArgumentList": [ - "CounterModel" - ] - } - }, - "typeArgumentList": [ - "LoginModel" - ] - } - }, - "typeArgumentList": [ - "CounterModel" - ], - "methodMap": {}, - "digest": "40c478199087adf8f05936a7f7bc34bd" -} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata b/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata deleted file mode 100644 index a0216d16..00000000 --- a/fair_provider/example/assets/fair/lib_ui_counter_page_provider.fair.metadata +++ /dev/null @@ -1,7 +0,0 @@ -# Generated by Fair on 2023-10-25 19:35:14.838560. - -source: example|lib/ui/counter_page_provider.dart -md5: fb818b363103f7c487d2f2aeb0162b60 -json: example|build/fair/lib_ui_counter_page_provider.fair.json -bin: example|build/fair/lib_ui_counter_page_provider.fair.bin -date: 2023-10-25 19:35:14.839444 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.js b/fair_provider/example/assets/fair/lib_ui_example_page.fair.js new file mode 100644 index 00000000..fb31eeed --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.js @@ -0,0 +1,11 @@ +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ExamplePageState(){const inner=_ExamplePageState.__inner__;if(this==__global__){return new _ExamplePageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ExamplePageState.prototype.ctor.apply(this,args);return this;}}_ExamplePageState.__inner__=function inner(){this.exampleModelJson=`{ + "stringField":"字符串字段", + "intField":22, + "doubleField":3.3, + "boolField":true, + "listField":[1,2,3,4], + "innerModel":{ + "innerBoolField":false + } +} + `;this.stringList=['白日依山尽','黄河入海流','欲穷千里目','更上一层楼'];this.stringIndex=0;this.nestedList=[['1','2','3','4'],['5','6','7','8'],['9','10','11','12'],['13','14','15','16']];this.listIndex=0;};_ExamplePageState.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_updateAll:function _updateAll(context,context2){const __thiz__=this;const __arg_ctx__={context,context2,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");if(stringIndex>3){stringIndex=0;}exampleModel.stringField=stringList.__op_idx__(stringIndex++);exampleModel.intField++;if(exampleModel.doubleField==33.3){exampleModel.doubleField=66.6;}else{exampleModel.doubleField=33.3;}exampleModel.boolField=!exampleModel.boolField;if(listIndex>3){listIndex=0;}exampleModel.listField=nestedList.__op_idx__(listIndex++);if(exampleModel.innerModel.innerBoolField==true){exampleModel.innerModel.innerBoolField=false;}else{exampleModel.innerModel.innerBoolField=true;}exampleModel.notify();}}},_onSliderChange:function _onSliderChange(input){const __thiz__=this;const __arg_ctx__={input,};with(__thiz__){with(__arg_ctx__){let progress=input.__op_idx__(0);let fairContext=input.__op_idx__(1);let exampleModel=fairContext.read("ExampleModel");exampleModel.doubleField=progress;exampleModel.notify();}}},_toggleBoolChange:function _toggleBoolChange(input){const __thiz__=this;const __arg_ctx__={input,};with(__thiz__){with(__arg_ctx__){let flag=input.__op_idx__(0);let fairContext=input.__op_idx__(1);let exampleModel=fairContext.read("ExampleModel");exampleModel.boolField=flag;exampleModel.notify();}}},_updateStringField:function _updateStringField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){if(stringIndex>3){stringIndex=0;}let exampleModel=context.read("ExampleModel");exampleModel.stringField=stringList.__op_idx__(stringIndex++);exampleModel.notify();}}},_updateIntField:function _updateIntField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");exampleModel.intField++;exampleModel.notify();}}},_updateDoubleField:function _updateDoubleField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");if(exampleModel.doubleField==33.3){exampleModel.doubleField=66.6;}else{exampleModel.doubleField=33.3;}exampleModel.notify();}}},_updateBoolField:function _updateBoolField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");exampleModel.boolField=!exampleModel.boolField;exampleModel.notify();}}},_updateListField:function _updateListField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");if(listIndex>3){listIndex=0;}exampleModel.listField=nestedList.__op_idx__(listIndex++);exampleModel.notify();}}},_updateInnerField:function _updateInnerField(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let exampleModel=context.read("ExampleModel");if(exampleModel.innerModel.innerBoolField==true){exampleModel.innerModel.innerBoolField=false;}else{exampleModel.innerModel.innerBoolField=true;}exampleModel.notify();}}},};_ExamplePageState.prototype.ctor=function(){};;return _ExamplePageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.json b/fair_provider/example/assets/fair/lib_ui_example_page.fair.json new file mode 100644 index 00000000..14d979ee --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.json @@ -0,0 +1,867 @@ +{ + "className": "FairChangeNotifierProvider", + "na": { + "initialJson": "^(exampleModelJson)", + "child": { + "className": "Scaffold", + "na": { + "appBar": { + "className": "AppBar", + "na": { + "title": { + "className": "Text", + "pa": [ + "基本使用示例" + ] + } + } + }, + "body": { + "className": "Padding", + "na": { + "padding": { + "className": "EdgeInsets.only", + "na": { + "left": 16.0 + } + }, + "child": { + "className": "ListView", + "na": { + "scrollDirection": "#(Axis.vertical)", + "children": [ + { + "className": "Text", + "pa": [ + "初始化json信息👇🏻" + ] + }, + { + "className": "Text", + "pa": [ + "^(exampleModelJson)" + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.green)" + } + } + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取stringField: " + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readString", + "pa": [ + "^(value)", + "stringField" + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取intField: " + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.anyToString", + "pa": [ + { + "className": "SugarProvider.readInt", + "pa": [ + "^(value)", + "intField" + ] + } + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取doubleField: " + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.anyToString", + "pa": [ + { + "className": "SugarProvider.readDouble", + "pa": [ + "^(value)", + "doubleField" + ] + } + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取boolField: " + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.anyToString", + "pa": [ + { + "className": "SugarProvider.readBool", + "pa": [ + "^(value)", + "boolField" + ] + } + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取listField: " + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.anyToString", + "pa": [ + { + "className": "SugarProvider.readList", + "pa": [ + "^(value)", + "listField" + ] + } + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取数组下标为1字段:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readAsStringInList", + "pa": [ + "^(value)", + "listField", + 1 + ] + } + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + }, + { + "className": "Row", + "na": { + "children": [ + { + "className": "Text", + "pa": [ + "读取innerModel.innerBoolField: " + ] + }, + { + "className": "FairSelector", + "na": { + "builder": { + "className": "SugarProvider.selectorBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + "^(value)" + ], + "na": { + "style": { + "className": "TextStyle", + "na": { + "color": "#(Colors.red)" + } + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + }, + "selector": { + "className": "SugarProvider.selector", + "pa": [ + { + "className": "SugarProvider.evaluationAsString", + "pa": [ + "^(value)", + "innerModel.innerBoolField" + ], + "functionParameters": { + "pa": [ + "context", + "value" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel", + "String" + ] + } + ] + } + }, + { + "className": "Wrap", + "na": { + "spacing": 8, + "runSpacing": 8, + "children": [ + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateStringField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变stringField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + }, + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateIntField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变intField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + }, + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateDoubleField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变doubleField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + }, + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateBoolField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变boolField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + }, + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateListField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变listField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + }, + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "ElevatedButton", + "na": { + "onPressed": "@(_updateInnerField(^(context)))", + "child": { + "className": "Text", + "pa": [ + "改变innerModel.innerBoolField" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + ] + } + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.concatenates", + "pa": [ + "是否选中:", + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "boolField" + ] + } + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + }, + { + "className": "Align", + "na": { + "alignment": "#(Alignment.centerLeft)", + "child": { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "Switch", + "na": { + "value": { + "className": "SugarProvider.readBool", + "pa": [ + "^(value)", + "boolField" + ] + }, + "onChanged": { + "className": "SugarProvider.onValueChangeWithFairContext", + "na": { + "function": "@(_toggleBoolChange)", + "fairContext": "^(fairContext)" + } + } + }, + "functionParameters": { + "pa": [ + "fairContext" + ] + } + } + ] + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + } + }, + { + "className": "Align", + "na": { + "alignment": "#(Alignment.centerLeft)", + "child": { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.concatenates", + "pa": [ + "进度:", + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "doubleField" + ] + } + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + } + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "Slider", + "na": { + "max": 100, + "value": { + "className": "SugarProvider.readDouble", + "pa": [ + "^(value)", + "doubleField" + ] + }, + "onChanged": { + "className": "SugarProvider.onValueChangeWithFairContext", + "na": { + "function": "@(_onSliderChange)", + "fairContext": "^(fairContext)" + } + } + }, + "functionParameters": { + "pa": [ + "fairContext" + ] + } + } + ] + } + }, + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "ExampleModel" + ] + } + ] + } + } + } + }, + "floatingActionButton": { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "FloatingActionButton", + "na": { + "onPressed": "@(_updateAll(^(context),^(context)))", + "tooltip": "Increment", + "child": { + "className": "Icon", + "pa": [ + "#(Icons.add)" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + } + } + }, + "typeArgumentList": [ + "ExampleModel" + ], + "methodMap": {}, + "digest": "e892fd0f6f5e2dd8e7bf13ebf6525b34" +} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata new file mode 100644 index 00000000..c3adbf76 --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata @@ -0,0 +1,7 @@ +# Generated by Fair on 2023-11-06 16:28:36.335620. + +source: example|lib/ui/example_page.dart +md5: df9a174788a4cad9b1e55169ba5e5dcf +json: example|build/fair/lib_ui_example_page.fair.json +bin: example|build/fair/lib_ui_example_page.fair.bin +date: 2023-11-06 16:28:36.336063 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.js b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.js new file mode 100644 index 00000000..240afade --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.js @@ -0,0 +1 @@ +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _ExamplePage2State(){const inner=_ExamplePage2State.__inner__;if(this==__global__){return new _ExamplePage2State({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_ExamplePage2State.prototype.ctor.apply(this,args);return this;}}_ExamplePage2State.__inner__=function inner(){};_ExamplePage2State.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_incrementCounter:function _incrementCounter(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let topModel=context.read("TopModel");topModel.intField++;topModel.notify();}}},};_ExamplePage2State.prototype.ctor=function(){};;return _ExamplePage2State();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json new file mode 100644 index 00000000..dd0969fb --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json @@ -0,0 +1,97 @@ +{ + "className": "Scaffold", + "na": { + "appBar": { + "className": "AppBar", + "na": { + "title": { + "className": "Text", + "pa": [ + "跨组件共享状态" + ] + } + } + }, + "body": { + "className": "Center", + "na": { + "child": { + "className": "Column", + "na": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Text", + "pa": [ + "监听TopModel中的intFiled:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "intField" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "TopModel" + ] + } + ] + } + } + } + }, + "floatingActionButton": { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "FloatingActionButton", + "na": { + "onPressed": "@(_incrementCounter(^(context)))", + "tooltip": "Increment", + "child": { + "className": "Icon", + "pa": [ + "#(Icons.add)" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + }, + "methodMap": {}, + "digest": "2411e8da388fc4af26fa00d0278de484" +} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata new file mode 100644 index 00000000..c8c87d89 --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata @@ -0,0 +1,7 @@ +# Generated by Fair on 2023-11-06 16:28:36.313857. + +source: example|lib/ui/example_page2.dart +md5: 7e0452e2e8e8d84789b198debd6035da +json: example|build/fair/lib_ui_example_page2.fair.json +bin: example|build/fair/lib_ui_example_page2.fair.bin +date: 2023-11-06 16:28:36.314082 diff --git a/fair_provider/example/lib/entity/counter_model.dart b/fair_provider/example/lib/entity/counter_model.dart index d3fe5460..ac46367c 100644 --- a/fair_provider/example/lib/entity/counter_model.dart +++ b/fair_provider/example/lib/entity/counter_model.dart @@ -1,14 +1,5 @@ import 'package:fair_provider/fair_provider.dart'; class CounterModel extends FairChangeNotifier { - - var count = 0; - var testName = "dsds"; - SomeModel? someModel; - + int count = 0; } - -class SomeModel{ - var a = "a"; - -} \ No newline at end of file diff --git a/fair_provider/example/lib/entity/example_model.dart b/fair_provider/example/lib/entity/example_model.dart new file mode 100644 index 00000000..409c115c --- /dev/null +++ b/fair_provider/example/lib/entity/example_model.dart @@ -0,0 +1,14 @@ +import 'package:fair_provider/fair_provider.dart'; + +class ExampleModel extends FairChangeNotifier { + String? stringField; + int intField = 1; + double? doubleField; + bool boolField = false; + List? listField; + ExampleInnerModel? innerModel; +} + +class ExampleInnerModel { + bool? innerBoolField; +} diff --git a/fair_provider/example/lib/entity/login_model.dart b/fair_provider/example/lib/entity/login_model.dart deleted file mode 100644 index ce68490f..00000000 --- a/fair_provider/example/lib/entity/login_model.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:fair_provider/fair_provider.dart'; - -class LoginModel extends FairChangeNotifier { - - String? account; - String? password; - -} \ No newline at end of file diff --git a/fair_provider/example/lib/entity/top_model.dart b/fair_provider/example/lib/entity/top_model.dart new file mode 100644 index 00000000..740e373c --- /dev/null +++ b/fair_provider/example/lib/entity/top_model.dart @@ -0,0 +1,6 @@ +import 'package:fair_provider/fair_provider.dart'; + +class TopModel extends FairChangeNotifier { + int intField = 1; + double doubleFiled = 0.0; +} \ No newline at end of file diff --git a/fair_provider/example/lib/main.dart b/fair_provider/example/lib/main.dart index 3a03dcac..b660267d 100644 --- a/fair_provider/example/lib/main.dart +++ b/fair_provider/example/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:example/entity/top_model.dart'; import 'package:fair/fair.dart'; import 'package:fair_provider/fair_provider.dart'; import 'package:flutter/material.dart'; @@ -6,16 +7,27 @@ void main() { WidgetsFlutterBinding.ensureInitialized(); FairApp.runApplication( - FairApp( - generated: FairAppModule(), - child: const MyApp(), - dynamicWidgetBuilder: (proxyMirror, page, bound, {bundle}) => - ProviderDynamicWidgetBuilder(proxyMirror, page, bound, - bundle: bundle), - ), - plugins: {'FairProvider': FairProvider()}, - jsPlugins: {'fair_provider': 'packages/fair_provider/assets/plugin/fair_provider_plugin.js'} - ); + FairApp( + generated: FairProviderModule(), + child: FairChangeNotifierProvider( + initialJson: ''' +{ + "intField":99 +} + ''', + child: const MyApp(), + ), + dynamicWidgetBuilder: (proxyMirror, page, bound, {bundle}) => + ProviderDynamicWidgetBuilder(proxyMirror, page, bound, + bundle: bundle), + ), + plugins: { + 'FairProvider': FairProvider() + }, + jsPlugins: { + 'fair_provider': + 'packages/fair_provider/assets/plugin/fair_provider_plugin.js' + }); } class MyApp extends StatelessWidget { @@ -37,14 +49,36 @@ class MyApp extends StatelessWidget { body: Builder( builder: (context) => ListView( children: [ - addItem("CounterProvider Fair", () { + addItem("计数器示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_counter_page", + path: + "assets/fair/lib_ui_counter_page.fair.json", + ), + )); + }), + addItem("基本使用示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_example_page", + path: + "assets/fair/lib_ui_example_page.fair.json", + ), + )); + }), + addItem("跨页面共享状态", () { Navigator.push( context, MaterialPageRoute( builder: (context) => FairWidget( - name: "CounterProvider", + name: "lib_ui_example_page2", path: - "assets/fair/lib_ui_counter_page_provider.fair.json", + "assets/fair/lib_ui_example_page2.fair.json", ), )); }), diff --git a/fair_provider/example/lib/ui/counter_page.dart b/fair_provider/example/lib/ui/counter_page.dart new file mode 100644 index 00000000..b2855cd6 --- /dev/null +++ b/fair_provider/example/lib/ui/counter_page.dart @@ -0,0 +1,69 @@ +import 'package:example/entity/counter_model.dart'; +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +@FairPatch() +class CounterPage extends StatefulWidget { + const CounterPage({super.key}); + + @override + State createState() => _CounterPageState(); +} + +class _CounterPageState extends State { + var counterModelJson = ''' +{ + "count":22 +} + '''; + + void onLoad() {} + + void onUnload() {} + + void _incrementCounter(FairContext context) { + var counterModel = context.read("CounterModel"); + counterModel.count++; + counterModel.notify(); + } + + @override + Widget build(BuildContext context) { + return FairChangeNotifierProvider( + initialJson: counterModelJson, + child: Scaffold( + appBar: AppBar( + title: const Text( + "计数器示例", + ), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => + Text(SugarProvider.readAsString(value, 'count'))), + ), + ], + ), + ), + floatingActionButton: FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), + ), + ), + ); + } +} diff --git a/fair_provider/example/lib/ui/counter_page_provider.dart b/fair_provider/example/lib/ui/counter_page_provider.dart deleted file mode 100644 index 09d32bbb..00000000 --- a/fair_provider/example/lib/ui/counter_page_provider.dart +++ /dev/null @@ -1,114 +0,0 @@ -import 'package:example/entity/counter_model.dart'; -import 'package:example/entity/login_model.dart'; -import 'package:fair/fair.dart'; -import 'package:fair_provider/fair_provider.dart'; -import 'package:flutter/material.dart'; - -@FairPatch() -class CounterPageProvider extends StatefulWidget { - const CounterPageProvider({super.key}); - - @override - State createState() => _CounterPageProviderState(); -} - -class _CounterPageProviderState extends State { - var title = "我是写在js侧的title"; - - var counterModelJson = ''' -{ - "count":22, - "testName":"zzzzzz", - "someModel":{ - "a":"ffffff" - } -} - '''; - - var loginModelJson = ''' - { - "account":"qwerty12345", - "password":"zxcv54321" -} - '''; - - var counterModelJson2 = ''' -{ - "count":333, - "testName":"testName的初始值", - "someModel":{ - "a":"someModel中a的初始值" - } -} - '''; - - void onLoad() {} - - void onUnload() {} - - void _incrementCounter(FairContext context) { - var counterModel = context.read("CounterModel"); - counterModel.count++; - counterModel.testName = "及哦飞机佛IE我房间"; - counterModel.someModel?.a = "hahahaha"; - counterModel.notify(); - } - - @override - Widget build(BuildContext context) { - return FairChangeNotifierProvider( - initialJson: counterModelJson, - child: FairChangeNotifierProvider( - initialJson: loginModelJson, - child: FairChangeNotifierProvider( - initialJson: counterModelJson2, - child: Scaffold( - appBar: AppBar( - title: Text( - title, - ), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - FairConsumer( - builder: FairSugarProvider.consumerBuilder((context, value, - child) => - Text(FairSugarProvider.anyToString( - FairSugarProvider.valueReader(value, 'count')))), - ), - FairConsumer( - builder: FairSugarProvider.consumerBuilder( - (context, value, child) => Text( - FairSugarProvider.stringValueReader( - value, 'testName'))), - ), - FairSelector( - builder: FairSugarProvider.selectorBuilder( - (context, value, child) => Text(value)), - selector: FairSugarProvider.selector((context, value) => - FairSugarProvider.evaluationToString( - value, 'someModel.a'))), - ], - ), - ), - floatingActionButton: FairContextBuilder( - builder: FairSugarProvider.widgetBuilder( - (context) => FloatingActionButton( - onPressed: () { - _incrementCounter(context); - }, - tooltip: 'Increment', - child: const Icon(Icons.add), - )), - ), - ), - ), - ), - ); - } -} diff --git a/fair_provider/example/lib/ui/example_page.dart b/fair_provider/example/lib/ui/example_page.dart new file mode 100644 index 00000000..0dabe8dd --- /dev/null +++ b/fair_provider/example/lib/ui/example_page.dart @@ -0,0 +1,376 @@ +import 'dart:math'; + +import 'package:example/entity/example_model.dart'; +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +@FairPatch() +class ExamplePage extends StatefulWidget { + const ExamplePage({super.key}); + + @override + State createState() => _ExamplePageState(); +} + +class _ExamplePageState extends State { + var exampleModelJson = ''' +{ + "stringField":"字符串字段", + "intField":22, + "doubleField":3.3, + "boolField":true, + "listField":[1,2,3,4], + "innerModel":{ + "innerBoolField":false + } +} + '''; + + var stringList = ['白日依山尽', '黄河入海流', '欲穷千里目', '更上一层楼']; + var stringIndex = 0; + + var nestedList = [ + ['1', '2', '3', '4'], + ['5', '6', '7', '8'], + ['9', '10', '11', '12'], + ['13', '14', '15', '16'] + ]; + var listIndex = 0; + + void onLoad() {} + + void onUnload() {} + + ///更新全部 + void _updateAll(FairContext context, FairContext context2) { + var exampleModel = context.read("ExampleModel"); + if (stringIndex > 3) { + stringIndex = 0; + } + exampleModel.stringField = stringList[stringIndex++]; + exampleModel.intField++; + if (exampleModel.doubleField == 33.3) { + exampleModel.doubleField = 66.6; + } else { + exampleModel.doubleField = 33.3; + } + exampleModel.boolField = !exampleModel.boolField; + if (listIndex > 3) { + listIndex = 0; + } + exampleModel.listField = nestedList[listIndex++]; + if (exampleModel.innerModel?.innerBoolField == true) { + exampleModel.innerModel?.innerBoolField = false; + } else { + exampleModel.innerModel?.innerBoolField = true; + } + exampleModel.notify(); + } + + ///进度条变化 + void _onSliderChange(List input) { + var progress = input[0]; + FairContext fairContext = input[1]; + var exampleModel = fairContext.read("ExampleModel"); + exampleModel.doubleField = progress; + exampleModel.notify(); + } + + ///切换选中状态变化 + void _toggleBoolChange(List input) { + var flag = input[0]; + FairContext fairContext = input[1]; + var exampleModel = fairContext.read("ExampleModel"); + exampleModel.boolField = flag; + exampleModel.notify(); + } + + ///更新字符串字段 + void _updateStringField(FairContext context) { + if (stringIndex > 3) { + stringIndex = 0; + } + var exampleModel = context.read("ExampleModel"); + exampleModel.stringField = stringList[stringIndex++]; + exampleModel.notify(); + } + + ///更新整型字段 + void _updateIntField(FairContext context) { + var exampleModel = context.read("ExampleModel"); + exampleModel.intField++; + exampleModel.notify(); + } + + ///更新浮点型字段 + void _updateDoubleField(FairContext context) { + var exampleModel = context.read("ExampleModel"); + if (exampleModel.doubleField == 33.3) { + exampleModel.doubleField = 66.6; + } else { + exampleModel.doubleField = 33.3; + } + exampleModel.notify(); + } + + ///更新布尔值字段 + void _updateBoolField(FairContext context) { + var exampleModel = context.read("ExampleModel"); + exampleModel.boolField = !exampleModel.boolField; + exampleModel.notify(); + } + + ///更新数组字段 + void _updateListField(FairContext context) { + var exampleModel = context.read("ExampleModel"); + if (listIndex > 3) { + listIndex = 0; + } + exampleModel.listField = nestedList[listIndex++]; + exampleModel.notify(); + } + + ///更新嵌套字段 + void _updateInnerField(FairContext context) { + var exampleModel = context.read("ExampleModel"); + if (exampleModel.innerModel?.innerBoolField == true) { + exampleModel.innerModel?.innerBoolField = false; + } else { + exampleModel.innerModel?.innerBoolField = true; + } + exampleModel.notify(); + } + + @override + Widget build(BuildContext context) { + return FairChangeNotifierProvider( + initialJson: exampleModelJson, + child: Scaffold( + appBar: AppBar( + title: const Text( + "基本使用示例", + ), + ), + body: Padding( + padding: const EdgeInsets.only(left: 16.0), // 设置左侧内边距 + child: ListView( + scrollDirection: Axis.vertical, // 设置滑动方向为垂直或水平 + children: [ + const Text( + '初始化json信息👇🏻', + ), + Text( + exampleModelJson, + style: const TextStyle(color: Colors.green), + ), + Row(children: [ + const Text('读取stringField: '), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.readString(value, 'stringField'), + style: const TextStyle(color: Colors.red), + )), + ), + ]), + Row( + children: [ + const Text('读取intField: '), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.anyToString( + SugarProvider.readInt(value, 'intField')), + style: const TextStyle(color: Colors.red), + )), + ), + ], + ), + Row( + children: [ + const Text('读取doubleField: '), + FairConsumer( + builder: SugarProvider.consumerBuilder((context, value, + child) => + Text( + SugarProvider.anyToString( + SugarProvider.readDouble(value, 'doubleField')), + style: const TextStyle(color: Colors.red), + )), + ), + ], + ), + Row( + children: [ + const Text('读取boolField: '), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.anyToString( + SugarProvider.readBool(value, 'boolField')), + style: const TextStyle(color: Colors.red), + )), + ), + ], + ), + Row( + children: [ + const Text('读取listField: '), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.anyToString( + SugarProvider.readList(value, 'listField')), + style: const TextStyle(color: Colors.red), + )), + ), + ], + ), + Row( + children: [ + const Text('读取数组下标为1字段:'), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.readAsStringInList( + value, 'listField', 1), + style: const TextStyle(color: Colors.red), + )), + ), + ], + ), + Row( + children: [ + const Text('读取innerModel.innerBoolField: '), + FairSelector( + builder: SugarProvider.selectorBuilder( + (context, value, child) => Text( + value, + style: const TextStyle(color: Colors.red), + )), + selector: SugarProvider.selector((context, value) => + SugarProvider.evaluationAsString( + value, 'innerModel.innerBoolField'))), + ], + ), + Wrap(spacing: 8, runSpacing: 8, children: [ + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateStringField(context); + }, + child: const Text('改变stringField'), + ))), + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateIntField(context); + }, + child: const Text('改变intField'), + ))), + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateDoubleField(context); + }, + child: const Text('改变doubleField'), + ))), + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateBoolField(context); + }, + child: const Text('改变boolField'), + ))), + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateListField(context); + }, + child: const Text('改变listField'), + ))), + FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => ElevatedButton( + onPressed: () { + _updateInnerField(context); + }, + child: const Text('改变innerModel.innerBoolField'), + ))), + ]), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.concatenates( + '是否选中:', + SugarProvider.readAsString(value, 'boolField'), + ), + )), + ), + Align( + alignment: Alignment.centerLeft, + child: FairConsumer( + builder: SugarProvider.consumerBuilder((context, value, + child) => + FairContextBuilder( + builder: SugarProvider.widgetBuilder((fairContext) => + Switch( + value: + SugarProvider.readBool(value, "boolField"), + onChanged: + SugarProvider.onValueChangeWithFairContext( + function: _toggleBoolChange, + fairContext: fairContext))), + )), + ), + ), + Align( + alignment: Alignment.centerLeft, + child: FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text( + SugarProvider.concatenates( + '进度:', + SugarProvider.readAsString(value, 'doubleField'), + ), + )), + ), + ), + FairConsumer( + builder: SugarProvider.consumerBuilder((context, value, + child) => + FairContextBuilder( + builder: SugarProvider.widgetBuilder((fairContext) => + Slider( + max: 100, + value: SugarProvider.readDouble( + value, "doubleField"), + onChanged: + SugarProvider.onValueChangeWithFairContext( + function: _onSliderChange, + fairContext: fairContext))), + )), + ), + ], + ), + ), + floatingActionButton: FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _updateAll(context, context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), + ), + ), + ); + } +} diff --git a/fair_provider/example/lib/ui/example_page2.dart b/fair_provider/example/lib/ui/example_page2.dart new file mode 100644 index 00000000..931618a0 --- /dev/null +++ b/fair_provider/example/lib/ui/example_page2.dart @@ -0,0 +1,61 @@ +import 'package:example/entity/counter_model.dart'; +import 'package:example/entity/top_model.dart'; +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +@FairPatch() +class ExamplePage2 extends StatefulWidget { + const ExamplePage2({super.key}); + + @override + State createState() => _ExamplePage2State(); +} + +class _ExamplePage2State extends State { + void onLoad() {} + + void onUnload() {} + + void _incrementCounter(FairContext context) { + var topModel = context.read("TopModel"); + topModel.intField++; + topModel.notify(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text( + "跨组件共享状态", + ), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + '监听TopModel中的intFiled:', + ), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => + Text(SugarProvider.readAsString(value, 'intField'))), + ), + ], + ), + ), + floatingActionButton: FairContextBuilder( + builder: + SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), + ), + ); + } +} diff --git a/fair_provider/example/pubspec.lock b/fair_provider/example/pubspec.lock index 8a6f031c..0337fef1 100644 --- a/fair_provider/example/pubspec.lock +++ b/fair_provider/example/pubspec.lock @@ -500,7 +500,7 @@ packages: source: hosted version: "4.2.4" provider: - dependency: transitive + dependency: "direct main" description: name: provider sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f diff --git a/fair_provider/example/pubspec.yaml b/fair_provider/example/pubspec.yaml index 7a510fe0..dd9282e6 100644 --- a/fair_provider/example/pubspec.yaml +++ b/fair_provider/example/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 + provider: ^6.0.5 fair_provider: path: ../../fair_provider diff --git a/fair_provider/lib/fair_provider.dart b/fair_provider/lib/fair_provider.dart index 170c4220..e4b5fcbc 100644 --- a/fair_provider/lib/fair_provider.dart +++ b/fair_provider/lib/fair_provider.dart @@ -1,4 +1,4 @@ -export 'src/fair_app_module.dart'; +export 'src/fair_provider_module.dart'; export 'src/fair_provider_core.dart'; export 'src/fair_provider_plugin.dart'; export 'src/provider_dynamic_widget_builder.dart'; \ No newline at end of file diff --git a/fair_provider/lib/src/fair_app_module.dart b/fair_provider/lib/src/fair_app_module.dart deleted file mode 100644 index 86ccc036..00000000 --- a/fair_provider/lib/src/fair_app_module.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:fair/fair.dart'; -import 'package:flutter/material.dart'; - -import 'fair_provider_core.dart'; - -class FairAppModule extends GeneratedModule { - @override - Map components() { - return { - 'InputBorder.none': InputBorder.none, - 'FairChangeNotifierProvider': (props) => FairChangeNotifierProvider( - key: props['key'], - child: props['child'], - initialJson: props['initialJson'], - )..setTypeArgumentList(props['ta']), - 'FairConsumer': (props) => FairConsumer( - key: props['key'], - builder: props['builder'], - child: props['child'], - )..setTypeArgumentList(props['ta']), - 'FairSelector': (props) => FairSelector( - key: props['key'], - builder: props['builder'], - selector: props['selector'], - child: props['child'], - )..setTypeArgumentList(props['ta']), - 'FairSugarProvider.valueReader': (props) => - FairSugarProvider.valueReader(props['pa'][0], props['pa'][1]), - 'FairSugarProvider.stringValueReader': (props) => - FairSugarProvider.stringValueReader(props['pa'][0], props['pa'][1]), - 'FairSugarProvider.evaluationToString': (props) => - FairSugarProvider.evaluationToString(props['pa'][0], props['pa'][1]), - 'FairSugarProvider.anyToString': (props) => - FairSugarProvider.anyToString(props['pa'][0]), - 'FairContextBuilder': (props) => FairContextBuilder( - key: props['key'], - builder: props['builder'], - ), - }; - } - - @override - Map mapping() { - return {}; - } -} diff --git a/fair_provider/lib/src/fair_provider_core.dart b/fair_provider/lib/src/fair_provider_core.dart index 9448dce0..56618e3f 100644 --- a/fair_provider/lib/src/fair_provider_core.dart +++ b/fair_provider/lib/src/fair_provider_core.dart @@ -8,6 +8,8 @@ import 'package:collection/collection.dart'; import 'utils/time_record.dart'; +var providerLogOn = false; + final Map _fairModelPool = {}; class FairProviderPlugin { @@ -78,10 +80,9 @@ class FairContextBuilder extends StatelessWidget { /// Creates a widget that delegates its build to a callback. /// /// The [builder] argument must not be null. - const FairContextBuilder({ - super.key, + const FairContextBuilder({Key? key, required this.builder, - }) : assert(builder != null); + }) : super(key: key); /// Called to obtain the child widget. /// @@ -152,8 +153,10 @@ typedef FairSelectorSelector = dynamic Function( dynamic value, ); -class FairSugarProvider { - FairSugarProvider._(); +typedef OnValueChanged = void Function(dynamic value); + +class SugarProvider { + SugarProvider._(); /// Provider消费者Builder,用于Consumer static FairConsumerBuilder consumerBuilder(FairConsumerBuilder builder) => @@ -167,18 +170,96 @@ class FairSugarProvider { static FairSelectorSelector selector(FairSelectorSelector selector) => selector; - ///用于从 - static dynamic valueReader( - FairChangeNotifier model, - String key, - ) => - model[key] ?? 'null'; + static String readString( + FairChangeNotifier model, + String key, + ) { + return model[key] ?? 'null'; + } - static String stringValueReader( - FairChangeNotifier model, - String key, - ) => - (model[key] ?? 'null').toString(); + static String readAsString( + FairChangeNotifier model, + String key, + ) { + return model[key].toString() ?? 'null'; + } + + static int readInt( + FairChangeNotifier model, + String key, + ) { + return model[key] ?? 0; + } + + static double readDouble( + FairChangeNotifier model, + String key, + ) { + return model[key].toDouble() ?? 0.0; + } + + static bool readBool( + FairChangeNotifier model, + String key, + ) { + return model[key] ?? false; + } + + static dynamic readDynamic( + FairChangeNotifier model, + String key, + ) { + return model[key] ?? null; + } + + static List readList( + FairChangeNotifier model, + String key, + ) { + return model[key] ?? null; + } + + static String readStringInList( + FairChangeNotifier model, + String key, + int index) { + return model[key][index] ?? "null"; + } + + static String readAsStringInList( + FairChangeNotifier model, + String key, + int index) { + return model[key][index].toString() ?? "null"; + } + + static int readIntInList( + FairChangeNotifier model, + String key, + int index) { + return model[key] ?? 0; + } + + static double readDoubleInList( + FairChangeNotifier model, + String key, + int index) { + return model[key] ?? 0.0; + } + + static bool readBoolInList( + FairChangeNotifier model, + String key, + int index) { + return model[key] ?? false; + } + + static dynamic readDynamicInList( + FairChangeNotifier model, + String key, + int index) { + return model[key] ?? null; + } static dynamic anyToString(dynamic value) { return value.toString(); @@ -188,7 +269,43 @@ class FairSugarProvider { FairChangeNotifier model, String expression, ) => - (model.evaluation(expression) ?? 'null').toString(); + model.evaluation(expression) ?? 'null'; + + static String evaluationAsString( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression).toString() ?? 'null'; + + static int evaluationToInt( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression) ?? 0; + + static double evaluationToDouble( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression) ?? 0.0; + + static bool evaluationToBool( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression) ?? false; + + static List evaluationToList( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression) ?? null; + + static dynamic evaluationToDynamic( + FairChangeNotifier model, + String expression, + ) => + model.evaluation(expression) ?? null; static FairContextWidgetBuilder widgetBuilder( FairContextWidgetBuilder builder) => @@ -197,6 +314,21 @@ class FairSugarProvider { static FairContextWidgetBuilder2 widgetBuilder2( FairContextWidgetBuilder2 builder) => builder; + + /// Creates a new string by concatenating this string with [other]. + /// + /// Example: + /// ```dart + /// const string = 'dart' + 'lang'; // 'dartlang' + /// ``` + static String concatenates(String input, String other) => input + other; + + static OnValueChanged onValueChangeWithFairContext( + {required Function function,required FairContext fairContext}) { + return (value) { + function.call([value, fairContext]); + }; + } } class FairChangeNotifierProvider @@ -213,7 +345,7 @@ class FairChangeNotifierProvider final Runtime _runtime = Runtime(); - String? fairRuntimeTypeKey; + String? fairRuntimeTypeKey = T.toString(); List? typeArgumentList; diff --git a/fair_provider/lib/src/fair_provider_module.dart b/fair_provider/lib/src/fair_provider_module.dart new file mode 100644 index 00000000..c5b61439 --- /dev/null +++ b/fair_provider/lib/src/fair_provider_module.dart @@ -0,0 +1,90 @@ +import 'package:fair/fair.dart'; +import 'package:flutter/material.dart'; + +import 'fair_provider_core.dart'; + +class FairProviderModule extends GeneratedModule { + @override + Map components() { + return { + 'FairChangeNotifierProvider': (props) => + FairChangeNotifierProvider( + key: props['key'], + child: props['child'], + initialJson: props['initialJson'], + ) + ..setTypeArgumentList(props['ta']), + 'FairConsumer': (props) => + FairConsumer( + key: props['key'], + builder: props['builder'], + child: props['child'], + ) + ..setTypeArgumentList(props['ta']), + 'FairSelector': (props) => + FairSelector( + key: props['key'], + builder: props['builder'], + selector: props['selector'], + child: props['child'], + ) + ..setTypeArgumentList(props['ta']), + 'SugarProvider.readString': (props) => + SugarProvider.readString(props['pa'][0], props['pa'][1]), + 'SugarProvider.readAsString': (props) => + SugarProvider.readAsString(props['pa'][0], props['pa'][1]), + 'SugarProvider.readInt': (props) => + SugarProvider.readInt(props['pa'][0], props['pa'][1]), + 'SugarProvider.readDouble': (props) => + SugarProvider.readDouble(props['pa'][0], props['pa'][1]), + 'SugarProvider.readBool': (props) => + SugarProvider.readBool(props['pa'][0], props['pa'][1]), + 'SugarProvider.readDynamic': (props) => + SugarProvider.readDynamic(props['pa'][0], props['pa'][1]), + 'SugarProvider.readList': (props) => + SugarProvider.readList(props['pa'][0], props['pa'][1]), + 'SugarProvider.readStringInList': (props) => + SugarProvider.readStringInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.readAsStringInList': (props) => + SugarProvider.readAsStringInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.readIntInList': (props) => + SugarProvider.readIntInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.readDoubleInList': (props) => + SugarProvider.readDoubleInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.readBoolInList': (props) => + SugarProvider.readBoolInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.readDynamicInList': (props) => + SugarProvider.readDynamicInList(props['pa'][0], props['pa'][1], props['pa'][2]), + 'SugarProvider.evaluationToString': (props) => + SugarProvider.evaluationToString(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationAsString': (props) => + SugarProvider.evaluationAsString(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationToInt': (props) => + SugarProvider.evaluationToInt(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationToDouble': (props) => + SugarProvider.evaluationToDouble(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationToBool': (props) => + SugarProvider.evaluationToBool(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationToList': (props) => + SugarProvider.evaluationToList(props['pa'][0], props['pa'][1]), + 'SugarProvider.evaluationToDynamic': (props) => + SugarProvider.evaluationToDynamic(props['pa'][0], props['pa'][1]), + 'SugarProvider.anyToString': (props) => + SugarProvider.anyToString(props['pa'][0]), + 'SugarProvider.concatenates': (props) => + SugarProvider.concatenates(props['pa'][0], props['pa'][1]), + 'FairContextBuilder': (props) => + FairContextBuilder( + key: props['key'], + builder: props['builder'], + ), + 'SugarProvider.onValueChangeWithFairContext': (props) => + SugarProvider.onValueChangeWithFairContext(function: props['function'], fairContext: props['fairContext']), + }; + } + + @override + Map mapping() { + return {}; + } +} diff --git a/fair_provider/lib/src/provider_dynamic_widget_builder.dart b/fair_provider/lib/src/provider_dynamic_widget_builder.dart index a9be0e16..91a58fb6 100644 --- a/fair_provider/lib/src/provider_dynamic_widget_builder.dart +++ b/fair_provider/lib/src/provider_dynamic_widget_builder.dart @@ -17,29 +17,29 @@ class ProviderDynamicWidgetBuilder extends DynamicWidgetBuilder { dynamic convert(BuildContext context, Map map, Map? methodMap, {Domain? domain}) { var name = map[tag]; - if (name == 'FairSugarProvider.consumerBuilder' || - name == 'FairSugarProvider.selectorBuilder') { + if (name == 'SugarProvider.consumerBuilder' || + name == 'SugarProvider.selectorBuilder') { return _buildFairSugarConsumerBuilder( context, map, methodMap, domain: domain, ); - } else if (name == 'FairSugarProvider.selector') { + } else if (name == 'SugarProvider.selector') { return _buildFairSugarSelector( context, map, methodMap, domain: domain, ); - } else if (name == 'FairSugarProvider.widgetBuilder') { + } else if (name == 'SugarProvider.widgetBuilder') { return _buildFairSugarWidgetBuilder( context, map, methodMap, domain: domain, ); - } else if (name == 'FairSugarProvider.widgetBuilder2') { + } else if (name == 'SugarProvider.widgetBuilder2') { return _buildFairSugarWidgetBuilder2( context, map, diff --git a/fair_provider/lib/src/utils/time_record.dart b/fair_provider/lib/src/utils/time_record.dart index 060ee5ff..86c90cf7 100644 --- a/fair_provider/lib/src/utils/time_record.dart +++ b/fair_provider/lib/src/utils/time_record.dart @@ -1,5 +1,6 @@ -class TimeRecord { +import 'package:fair_provider/fair_provider.dart'; +class TimeRecord { TimeRecord(this.tag); String? tag; @@ -15,7 +16,8 @@ class TimeRecord { _endTime = DateTime.now(); final duration = _endTime.difference(_startTime); final milliseconds = duration.inMilliseconds; - print('耗时统计 Time elapsed: $milliseconds milliseconds'); + if (providerLogOn) { + print('耗时统计 Time elapsed: $milliseconds milliseconds'); + } } - -} \ No newline at end of file +} diff --git a/fair_provider/pubspec.lock b/fair_provider/pubspec.lock index 889b5f76..eb5006a5 100644 --- a/fair_provider/pubspec.lock +++ b/fair_provider/pubspec.lock @@ -188,7 +188,7 @@ packages: fair: dependency: "direct main" description: - path: "../../fair/fair" + path: "../fair" relative: true source: path version: "3.3.0" @@ -203,28 +203,28 @@ packages: fair_compiler: dependency: "direct dev" description: - path: "../../fair/compiler" + path: "../compiler" relative: true source: path version: "1.8.0" fair_dart2dsl: dependency: "direct overridden" description: - path: "../../fair/dart2dsl" + path: "../dart2dsl" relative: true source: path version: "1.4.0" fair_dart2js: dependency: "direct overridden" description: - path: "../../fair/dart2js" + path: "../dart2js" relative: true source: path version: "1.4.0" fair_version: dependency: "direct overridden" description: - path: "../../fair/flutter_version/flutter_3_7_0" + path: "../flutter_version/flutter_3_7_0" relative: true source: path version: "3.7.0" @@ -713,5 +713,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=2.19.6 <3.0.0" + dart: ">=2.19.0 <3.0.0" flutter: ">=3.7.0" diff --git a/fair_provider/pubspec.yaml b/fair_provider/pubspec.yaml index dee023a7..38a9b688 100644 --- a/fair_provider/pubspec.yaml +++ b/fair_provider/pubspec.yaml @@ -4,7 +4,8 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=2.19.6 <3.0.0' + sdk: ">=2.12.0 <4.0.0" + flutter: ">=1.16.0" dependencies: flutter: From 1e6d0329ab19c874ca8858e1ce356fb2a3a804f1 Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Mon, 6 Nov 2023 17:46:02 +0800 Subject: [PATCH 13/44] [feature]adapt provider and fix bug in Abstract fast access interface feature --- fair/lib/src/app.dart | 6 +++ fair/lib/src/render/decode.dart | 4 +- fair_provider/example/lib/main.dart | 23 ++++------- fair_provider/lib/fair_provider.dart | 3 +- .../lib/src/fair_provider_adapter.dart | 38 +++++++++++++++++++ 5 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 fair_provider/lib/src/fair_provider_adapter.dart diff --git a/fair/lib/src/app.dart b/fair/lib/src/app.dart index 2638af8c..e72f5cf6 100644 --- a/fair/lib/src/app.dart +++ b/fair/lib/src/app.dart @@ -122,6 +122,12 @@ class FairApp extends InheritedWidget with AppState { List? baseJsSources, List? adapters, }) { + if (plugins == null) { + plugins = {}; + } + if (jsPlugins == null) { + jsPlugins = {}; + } //init 3rd-library adapter initFairLibraryAdapter(app, plugins: plugins, jsPlugins: jsPlugins, adapters: adapters); diff --git a/fair/lib/src/render/decode.dart b/fair/lib/src/render/decode.dart index 959b928a..1f93e3dc 100644 --- a/fair/lib/src/render/decode.dart +++ b/fair/lib/src/render/decode.dart @@ -84,10 +84,10 @@ class Decoder { dynamicBuilder = DynamicWidgetBuilder(proxy as ProxyMirror?, page, bound, bundle: url); } else { dynamicBuilder = - dynamicBuilders.map((e) => e?.convert(context, map, methodMap)).toList().firstWhere((element) => element != null, orElse: () => null); + dynamicBuilders.firstWhere((element) => element?.convert(context, map, methodMap) != null, orElse: () => null); } Widget w =(dynamicBuilder ?? DynamicWidgetBuilder(proxy as ProxyMirror?, page, bound, bundle: url)).convert(context, map, methodMap) ?? - WarningWidget(parentContext:context,name: page, url: url, error: 'tag name not supported yet'); + WarningWidget(parentContext:context,name: page, url: url, error: 'tag name not supported yet'); return w; } } diff --git a/fair_provider/example/lib/main.dart b/fair_provider/example/lib/main.dart index b660267d..1964cb0e 100644 --- a/fair_provider/example/lib/main.dart +++ b/fair_provider/example/lib/main.dart @@ -7,27 +7,18 @@ void main() { WidgetsFlutterBinding.ensureInitialized(); FairApp.runApplication( - FairApp( - generated: FairProviderModule(), - child: FairChangeNotifierProvider( - initialJson: ''' + FairApp( + child: FairChangeNotifierProvider( + initialJson: ''' { "intField":99 } ''', - child: const MyApp(), - ), - dynamicWidgetBuilder: (proxyMirror, page, bound, {bundle}) => - ProviderDynamicWidgetBuilder(proxyMirror, page, bound, - bundle: bundle), + child: const MyApp(), ), - plugins: { - 'FairProvider': FairProvider() - }, - jsPlugins: { - 'fair_provider': - 'packages/fair_provider/assets/plugin/fair_provider_plugin.js' - }); + ), + adapters: [FairProviderAdapter()], + ); } class MyApp extends StatelessWidget { diff --git a/fair_provider/lib/fair_provider.dart b/fair_provider/lib/fair_provider.dart index e4b5fcbc..822c1115 100644 --- a/fair_provider/lib/fair_provider.dart +++ b/fair_provider/lib/fair_provider.dart @@ -1,4 +1,5 @@ export 'src/fair_provider_module.dart'; export 'src/fair_provider_core.dart'; export 'src/fair_provider_plugin.dart'; -export 'src/provider_dynamic_widget_builder.dart'; \ No newline at end of file +export 'src/provider_dynamic_widget_builder.dart'; +export 'src/fair_provider_adapter.dart'; \ No newline at end of file diff --git a/fair_provider/lib/src/fair_provider_adapter.dart b/fair_provider/lib/src/fair_provider_adapter.dart new file mode 100644 index 00000000..1901037b --- /dev/null +++ b/fair_provider/lib/src/fair_provider_adapter.dart @@ -0,0 +1,38 @@ +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; + +class FairProviderAdapter implements IFairLibraryAdapter { + @override + GeneratedModule provideGeneratedModule() { + return FairProviderModule(); + } + + @override + Map provideFairModule() { + return {}; + } + + @override + Map provideFairDelegate() { + return {}; + } + + @override + DynamicWidgetBuilderFunction provideDynamicWidgetBuilder() { + return (proxyMirror, page, bound, {bundle}) => + ProviderDynamicWidgetBuilder(proxyMirror, page, bound, bundle: bundle); + } + + @override + Map provideJSPlugins() { + return { + 'fair_provider': + 'packages/fair_provider/assets/plugin/fair_provider_plugin.js' + }; + } + + @override + Map provideFairPlugins() { + return {'FairProvider': FairProvider()}; + } +} From 67c45d335a5627ca17496caa997b544aa6a69761 Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Mon, 6 Nov 2023 21:43:19 +0800 Subject: [PATCH 14/44] [feature] improve readme --- fair_provider/README.md | 136 ++++++++++++++++-- fair_provider/lib/src/fair_provider_core.dart | 5 - 2 files changed, 126 insertions(+), 15 deletions(-) diff --git a/fair_provider/README.md b/fair_provider/README.md index 517d64bb..6c978039 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -1,16 +1,132 @@ -# fair_provider +`fair-provider` 是为了丰富 `fair` 的状态管理能力,以 `provider` 原理进行封装的sdk。使用其可以以类似 `provider` 的用法在 `fair` 页面中进行状态管理。 -An extension library for Fair on the Provider framework. +目前对 `provider` 中部分组件进行了适配支持,可以满足基本场景的使用,核心组件对应关系如下: +- ChangeNotifierProvider => [FairChangeNotifierProvider]() +- Consumer => [FairConsumer]() +- Selector => [FairSelector]() +- ChangeNotifier => [FairChangeNotifier]() -## Getting Started +## 快速接入 +pub添加依赖 +```yaml +dependencies: + fair_provider: ^0.0.1 +``` -This project is a starting point for a Flutter application. +初始化FairApp时传入FairProviderAdapter +```dart +///入口函数 +void main() { + WidgetsFlutterBinding.ensureInitialized(); -A few resources to get you started if this is your first Flutter project: + FairApp.runApplication( + FairApp( + child: const MyApp(), + ), + adapters: [FairProviderAdapter()], + ); +} +``` -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) +## 基本使用 +以计数器举例 +首先声明状态管理类,继承 `FairChangeNotifier` +```dart +class CounterModel extends FairChangeNotifier { + int count = 0; +} +``` +创建Provider,将初始化数据以json的形式传入 +```dart + var initialJson = ''' +{ + "count":22 +} + '''; -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. + @override + Widget build(BuildContext context) { + return FairChangeNotifierProvider( + initialJson: initialJson, + child: ... + ); + } +``` +使用 `FairConsumer`/`FairSelector` 配合语法糖来观察状态变更 +```dart + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => + Text(SugarProvider.readAsString(value, 'count'))), + ) +``` +编写事件处理函数,更新状态 +注意read函数的泛型即是状态管理类的类型,参数需要手动输入该类的字符串 +```dart + void _incrementCounter(FairContext context) { + var counterModel = context.read("CounterModel"); + counterModel.count++; + counterModel.notify(); + } +``` +由于fair中的逻辑函数会经 `dart2js` 编译器转换为js,所以是不支持 `BuildContext` 上下文的,这里需要使用经过特殊处理的 `FairContext`,`FairContext` 的构造需要 `FairContextBuilder` 配合语法糖 `SugarProvider.widgetBuilder` 来获取 +```dart +FairContextBuilder( + builder: SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), +), +``` + +## 进阶使用 +由于 `fair` 的布局动态化特性,在构建布局时不支持随意编写取值代码,这里需要借助 [SugarProvider]() 中的一系列语法糖来完成 + +这里以example中的基本示例代码举例 +```dart +class ExampleModel extends FairChangeNotifier { + String? stringField; + int intField = 1; + double? doubleField; + bool boolField = false; + List? listField; + ExampleInnerModel? innerModel; +} + +class ExampleInnerModel { + bool? innerBoolField; +} +``` +语法糖提供了基本类型和数组的取值api,具体使用细节可以参考example中的 [基本使用示例]() +```dart +///一个读取字符串的例子 +FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => Text(SugarProvider.readString(value, 'stringField'))), +), +``` +- **readString** 使用key从model中读取String类型的值 +- **readAsString** 使用key从model中读取并强转为String类型的值 +- **readInt** 使用key从model中读取Int类型的值 +- **readDouble** 使用key从model中读取Double类型的值 +- **readBool** 使用key从model中读取布尔型的值 +- **readList** 使用key从model中读取数组类型的值 +- **readDynamic** 使用key从model中读取任意类型的值 + +还支持表达式取值,使用规则如 `a.b.c` +```dart +FairSelector( + builder: SugarProvider.selectorBuilder((context, value, child) => Text(value)), + selector: SugarProvider.selector((context, value) =>SugarProvider.evaluationAsString(value, 'innerModel.innerBoolField')) +) +``` +- **evaluationToString** 使用表达式从model中读取String类型的值 +- **evaluationAsString** 使用表达式从model中读取并强转为String类型的值 +- **evaluationToInt** 使用表达式从model中读取Int类型的值 +- **evaluationToDouble** 使用表达式从model中读取Double类型的值 +- **evaluationToBool** 使用表达式从model中读取布尔型的值 +- **evaluationToList** 使用表达式从model中读取数组类型的值 +- **evaluationToDynamic** 使用表达式从model中读取任意类型的值 diff --git a/fair_provider/lib/src/fair_provider_core.dart b/fair_provider/lib/src/fair_provider_core.dart index 56618e3f..6c127473 100644 --- a/fair_provider/lib/src/fair_provider_core.dart +++ b/fair_provider/lib/src/fair_provider_core.dart @@ -74,7 +74,6 @@ class FairContext { } typedef FairContextWidgetBuilder = Widget Function(FairContext context); -typedef FairContextWidgetBuilder2 = Widget Function(String context); class FairContextBuilder extends StatelessWidget { /// Creates a widget that delegates its build to a callback. @@ -311,10 +310,6 @@ class SugarProvider { FairContextWidgetBuilder builder) => builder; - static FairContextWidgetBuilder2 widgetBuilder2( - FairContextWidgetBuilder2 builder) => - builder; - /// Creates a new string by concatenating this string with [other]. /// /// Example: From 6a0132d3b24b0340a9e3c3c569146abd64d3b66a Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Tue, 7 Nov 2023 10:59:49 +0800 Subject: [PATCH 15/44] [feature] improve readme --- fair_provider/README.md | 12 ++++- .../assets/fair/lib_ui_counter_page.fair.json | 52 ++++++++++++++++++- .../fair/lib_ui_counter_page.fair.metadata | 6 +-- .../fair/lib_ui_example_page.fair.metadata | 4 +- .../fair/lib_ui_example_page2.fair.metadata | 4 +- .../example/lib/ui/counter_page.dart | 7 +++ .../src/provider_dynamic_widget_builder.dart | 27 ---------- 7 files changed, 75 insertions(+), 37 deletions(-) diff --git a/fair_provider/README.md b/fair_provider/README.md index 6c978039..6ed27614 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -52,7 +52,7 @@ class CounterModel extends FairChangeNotifier { ); } ``` -使用 `FairConsumer`/`FairSelector` 配合语法糖来观察状态变更 +使用 `FairConsumer`/`FairSelector` 配合语法糖来观察状态变更,注意由于 `fair` DSL布局的特性,匿名函数是不支持的(后续计划支持优化),所以其中的builder函数还需要语法糖来包装下。最后从自定义的 `FairChangeNotifier` 状态管理对象中取值同样也需要借助语法糖来完成,目前已经提供了大量的取值语法糖,可以满足大多数场景的使用,详细说明可参考进阶使用部分。 ```dart FairConsumer( builder: SugarProvider.consumerBuilder( @@ -60,6 +60,14 @@ class CounterModel extends FairChangeNotifier { Text(SugarProvider.readAsString(value, 'count'))), ) ``` +```dart + FairSelector( + builder: SugarProvider.selectorBuilder( + (context, value, child) => + Text(SugarProvider.anyToString(value))), + selector: SugarProvider.selector((context, value) => + SugarProvider.readInt(value, 'count'))), +``` 编写事件处理函数,更新状态 注意read函数的泛型即是状态管理类的类型,参数需要手动输入该类的字符串 ```dart @@ -116,7 +124,7 @@ FairConsumer( - **readList** 使用key从model中读取数组类型的值 - **readDynamic** 使用key从model中读取任意类型的值 -还支持表达式取值,使用规则如 `a.b.c` +还支持表达式取值,使用规则如 `a.b.c`,基本原理则是将表达式发送到 `js` 侧使用 `eval` 函数进行取值,具体使用如下,也可参考 [基本使用示例]() ```dart FairSelector( builder: SugarProvider.selectorBuilder((context, value, child) => Text(value)), diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json index 727f5217..a069de0d 100644 --- a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json @@ -61,6 +61,56 @@ "typeArgumentList": [ "CounterModel" ] + }, + { + "className": "FairSelector", + "na": { + "builder": { + "className": "SugarProvider.selectorBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.anyToString", + "pa": [ + "^(value)" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + }, + "selector": { + "className": "SugarProvider.selector", + "pa": [ + { + "className": "SugarProvider.readInt", + "pa": [ + "^(value)", + "count" + ], + "functionParameters": { + "pa": [ + "context", + "value" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "CounterModel", + "int" + ] } ] } @@ -102,5 +152,5 @@ "CounterModel" ], "methodMap": {}, - "digest": "61dcca0ca25598d884689e6aa5679d0f" + "digest": "2a50f76be88274617782a4aaf287fae5" } \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata index 99cacf8c..04d5a236 100644 --- a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-06 16:28:36.272460. +# Generated by Fair on 2023-11-07 10:58:27.291068. source: example|lib/ui/counter_page.dart -md5: 90013183bf2a75597cb7644ab4e97676 +md5: d2e3f3306a431e152fa405978c7ff341 json: example|build/fair/lib_ui_counter_page.fair.json bin: example|build/fair/lib_ui_counter_page.fair.bin -date: 2023-11-06 16:28:36.272763 +date: 2023-11-07 10:58:27.291284 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata index c3adbf76..7f354866 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-06 16:28:36.335620. +# Generated by Fair on 2023-11-07 10:58:27.258829. source: example|lib/ui/example_page.dart md5: df9a174788a4cad9b1e55169ba5e5dcf json: example|build/fair/lib_ui_example_page.fair.json bin: example|build/fair/lib_ui_example_page.fair.bin -date: 2023-11-06 16:28:36.336063 +date: 2023-11-07 10:58:27.259251 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata index c8c87d89..2bd5af1b 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-06 16:28:36.313857. +# Generated by Fair on 2023-11-07 10:58:27.306859. source: example|lib/ui/example_page2.dart md5: 7e0452e2e8e8d84789b198debd6035da json: example|build/fair/lib_ui_example_page2.fair.json bin: example|build/fair/lib_ui_example_page2.fair.bin -date: 2023-11-06 16:28:36.314082 +date: 2023-11-07 10:58:27.307047 diff --git a/fair_provider/example/lib/ui/counter_page.dart b/fair_provider/example/lib/ui/counter_page.dart index b2855cd6..036bd9de 100644 --- a/fair_provider/example/lib/ui/counter_page.dart +++ b/fair_provider/example/lib/ui/counter_page.dart @@ -50,6 +50,13 @@ class _CounterPageState extends State { (context, value, child) => Text(SugarProvider.readAsString(value, 'count'))), ), + FairSelector( + builder: + SugarProvider.selectorBuilder((context, value, child) { + return Text(SugarProvider.anyToString(value)); + }), + selector: SugarProvider.selector((context, value) => + SugarProvider.readInt(value, 'count'))), ], ), ), diff --git a/fair_provider/lib/src/provider_dynamic_widget_builder.dart b/fair_provider/lib/src/provider_dynamic_widget_builder.dart index 91a58fb6..825d7d12 100644 --- a/fair_provider/lib/src/provider_dynamic_widget_builder.dart +++ b/fair_provider/lib/src/provider_dynamic_widget_builder.dart @@ -39,13 +39,6 @@ class ProviderDynamicWidgetBuilder extends DynamicWidgetBuilder { methodMap, domain: domain, ); - } else if (name == 'SugarProvider.widgetBuilder2') { - return _buildFairSugarWidgetBuilder2( - context, - map, - methodMap, - domain: domain, - ); } return super.convert( context, @@ -122,24 +115,4 @@ class ProviderDynamicWidgetBuilder extends DynamicWidgetBuilder { return builder; } - dynamic _buildFairSugarWidgetBuilder2(BuildContext context, Map map, Map? methodMap, - {Domain? domain}) { - dynamic source = pa0(map); - assert(source is Map); - List functionParameters = FunctionDomain.pa(source); - FairContextWidgetBuilder2 builder = (builderContext) { - return convert( - context, - source, - methodMap, - domain: FunctionDomain( - { - functionParameters[0]: builderContext, - }, - parent: domain, - ), - ); - }; - return builder; - } } From 142f89ddf6a4cf8b2d9a1e5c7fccfaf370821a66 Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 7 Nov 2023 13:54:23 +0800 Subject: [PATCH 16/44] readme update --- flutter_version/flutter_3_13_0/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter_version/flutter_3_13_0/README.md b/flutter_version/flutter_3_13_0/README.md index b84e0b31..c35051d8 100644 --- a/flutter_version/flutter_3_13_0/README.md +++ b/flutter_version/flutter_3_13_0/README.md @@ -58,7 +58,7 @@ dependency_overrides: fair_version: 3.10.0 ``` -- If your Flutter SDK is 3.13.0/3.13.1/3.13.2/3.13.3/3.13.4/3.13.5/3.13.6/3.13.7/3.13.8/3.13.9, we recommend that you use fair_version 3.10.0, like this: +- If your Flutter SDK is 3.13.0/3.13.1/3.13.2/3.13.3/3.13.4/3.13.5/3.13.6/3.13.7/3.13.8/3.13.9, we recommend that you use fair_version 3.13.0, like this: ```yaml dependency_overrides: From bb20ea10442ba76a9ac3cfa227d44f06908a4ffa Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Tue, 7 Nov 2023 15:11:07 +0800 Subject: [PATCH 17/44] [feature] improve readme --- fair_provider/README.md | 6 ++++-- fair_provider/example/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/fair_provider/README.md b/fair_provider/README.md index 6ed27614..70e016cd 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -77,7 +77,7 @@ class CounterModel extends FairChangeNotifier { counterModel.notify(); } ``` -由于fair中的逻辑函数会经 `dart2js` 编译器转换为js,所以是不支持 `BuildContext` 上下文的,这里需要使用经过特殊处理的 `FairContext`,`FairContext` 的构造需要 `FairContextBuilder` 配合语法糖 `SugarProvider.widgetBuilder` 来获取 +这里需要使用经过特殊处理的 `FairContext`,`FairContext` 的构造需要 `FairContextBuilder` 配合语法糖 `SugarProvider.widgetBuilder` 来获取 ```dart FairContextBuilder( builder: SugarProvider.widgetBuilder((context) => FloatingActionButton( @@ -124,7 +124,7 @@ FairConsumer( - **readList** 使用key从model中读取数组类型的值 - **readDynamic** 使用key从model中读取任意类型的值 -还支持表达式取值,使用规则如 `a.b.c`,基本原理则是将表达式发送到 `js` 侧使用 `eval` 函数进行取值,具体使用如下,也可参考 [基本使用示例]() +还支持表达式取值,使用规则如 `a.b.c`,以上面的ExampleModel为例,如果想读取成员 `innerModel` 中的 `innerBoolField` 字段,使用表达式取值可以这么写 ```dart FairSelector( builder: SugarProvider.selectorBuilder((context, value, child) => Text(value)), @@ -138,3 +138,5 @@ FairSelector( - **evaluationToBool** 使用表达式从model中读取布尔型的值 - **evaluationToList** 使用表达式从model中读取数组类型的值 - **evaluationToDynamic** 使用表达式从model中读取任意类型的值 + +## 更多示例请见 [example]() \ No newline at end of file diff --git a/fair_provider/example/pubspec.yaml b/fair_provider/example/pubspec.yaml index dd9282e6..aab22396 100644 --- a/fair_provider/example/pubspec.yaml +++ b/fair_provider/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=2.19.6 <3.0.0' + sdk: ">=2.12.0 <4.0.0" dependencies: flutter: From d8cba552043a7e1b336cbe49a0d599a286b0a19c Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Thu, 9 Nov 2023 19:43:34 +0800 Subject: [PATCH 18/44] [feature] improve readme --- fair_provider/README.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/fair_provider/README.md b/fair_provider/README.md index 70e016cd..fec0a758 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -28,9 +28,11 @@ void main() { } ``` -## 基本使用 +## 简单使用 以计数器举例 + 首先声明状态管理类,继承 `FairChangeNotifier` + ```dart class CounterModel extends FairChangeNotifier { int count = 0; @@ -90,10 +92,12 @@ FairContextBuilder( ), ``` -## 进阶使用 -由于 `fair` 的布局动态化特性,在构建布局时不支持随意编写取值代码,这里需要借助 [SugarProvider]() 中的一系列语法糖来完成 +## 使用说明 + +### 1. FairChangeNotifier的使用限制 + +注意 `FairChangeNotifier` 的定义有一些限制,这里以 [example]() 中的ExampleModel举例 -这里以example中的基本示例代码举例 ```dart class ExampleModel extends FairChangeNotifier { String? stringField; @@ -108,6 +112,22 @@ class ExampleInnerModel { bool? innerBoolField; } ``` + +1. 支持的类型为基本类型和数组、字典 + - int + - double + - String + - bool + - List + - Map +2. 目前只支持基本类型或者简单的嵌套对象(内部也是基本类型),不支持自定义函数(Function) +3. 当需要通知状态更新时需要手动调用`notify`/`notifyListeners` +4. 暂时不支持定义在`bean`结尾的包中 + +### 2. 在布局中取值需使用语法糖 + +由于 `fair` 的布局动态化特性,在构建布局时不支持随意编写取值代码,这里需要借助 [SugarProvider]() 中的一系列语法糖来完成 + 语法糖提供了基本类型和数组的取值api,具体使用细节可以参考example中的 [基本使用示例]() ```dart ///一个读取字符串的例子 From 94b18c2904ca90a55de8f324b13f09fbd4447e0d Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Fri, 10 Nov 2023 14:34:21 +0800 Subject: [PATCH 19/44] [feature] improve readme --- fair_provider/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fair_provider/README.md b/fair_provider/README.md index fec0a758..2d119977 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -113,13 +113,12 @@ class ExampleInnerModel { } ``` -1. 支持的类型为基本类型和数组、字典 +1. 支持的类型为基本类型和数组 - int - double - String - bool - List - - Map 2. 目前只支持基本类型或者简单的嵌套对象(内部也是基本类型),不支持自定义函数(Function) 3. 当需要通知状态更新时需要手动调用`notify`/`notifyListeners` 4. 暂时不支持定义在`bean`结尾的包中 From f8e8c8b7e28cbb910198261a14a20c3de21f69ea Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Fri, 10 Nov 2023 16:02:48 +0800 Subject: [PATCH 20/44] [fix] resolved the issue where the plugin was not functioning correctly on iOS 14 systems --- .../assets/plugin/fair_image_picker.js | 101 ++++++------ .../assets/plugin/fair_net_plugin.js | 146 +++++++++--------- .../assets/plugin/fair_permission.js | 104 ++++++------- .../assets/plugin/fair_toast_plugin.js | 34 ++-- 4 files changed, 190 insertions(+), 195 deletions(-) diff --git a/fair_extension/assets/plugin/fair_image_picker.js b/fair_extension/assets/plugin/fair_image_picker.js index be7106c7..52bd4811 100644 --- a/fair_extension/assets/plugin/fair_image_picker.js +++ b/fair_extension/assets/plugin/fair_image_picker.js @@ -1,56 +1,55 @@ let FairImagePickerCallback = {}; let FairImagePickerId = 1; -class FairImagePicker { - static photo = 'photo'; - static album = 'album'; - - static getImage(req) { - let selectorId = 'FairImagePickerId' + FairImagePickerId++; - // 设置回调 - let reqFunc = {}; - if (req.success) { - reqFunc['success'] = req.success; - } - if (req.failure) { - reqFunc['failure'] = req.failure; - } - FairImagePickerCallback[selectorId] = reqFunc; - let typeP = ''; - if (req.type) { - typeP = req.type; - } - let reqMap = { - pageName: '#FairKey#', - funcName: 'invokePlugin', - 'className':'FairImagePicker#getImage', - args: { - callId: selectorId, - type: typeP, - } - }; - invokeFlutterCommonChannel(JSON.stringify(reqMap), function (resp) { - //处理dart端返回的请求结果 - let respMap = JSON.parse(resp); - let respArgs = respMap['args']; - let respCallId = respArgs['callId']; - let imagePath = respArgs['imagePath']; - //处理需要返回的结果值 - let callback = FairImagePickerCallback[respCallId]; - if (callback == null) { - return - } - let successCallback = callback['success']; - let failureCallback = callback['failure']; - if (imagePath != null && successCallback != null) { - successCallback(imagePath); - } else { - if (failureCallback != null) { - failureCallback(''); - } - } - //移除回调 - FairImagePickerCallback[respCallId] = null; - }); +const FairImagePicker = { + photo: 'photo', + album: 'album', + getImage: function (req) { + let selectorId = 'FairImagePickerId' + FairImagePickerId++; + // 设置回调 + let reqFunc = {}; + if (req.success) { + reqFunc['success'] = req.success; + } + if (req.failure) { + reqFunc['failure'] = req.failure; + } + FairImagePickerCallback[selectorId] = reqFunc; + let typeP = ''; + if (req.type) { + typeP = req.type; + } + let reqMap = { + pageName: '#FairKey#', + funcName: 'invokePlugin', + 'className': 'FairImagePicker#getImage', + args: { + callId: selectorId, + type: typeP, + } + }; + invokeFlutterCommonChannel(JSON.stringify(reqMap), function (resp) { + //处理dart端返回的请求结果 + let respMap = JSON.parse(resp); + let respArgs = respMap['args']; + let respCallId = respArgs['callId']; + let imagePath = respArgs['imagePath']; + //处理需要返回的结果值 + let callback = FairImagePickerCallback[respCallId]; + if (callback == null) { + return + } + let successCallback = callback['success']; + let failureCallback = callback['failure']; + if (imagePath != null && successCallback != null) { + successCallback(imagePath); + } else { + if (failureCallback != null) { + failureCallback(''); + } + } + //移除回调 + FairImagePickerCallback[respCallId] = null; + }); } } \ No newline at end of file diff --git a/fair_extension/assets/plugin/fair_net_plugin.js b/fair_extension/assets/plugin/fair_net_plugin.js index 87a8d0b2..1d4f3c1c 100644 --- a/fair_extension/assets/plugin/fair_net_plugin.js +++ b/fair_extension/assets/plugin/fair_net_plugin.js @@ -1,78 +1,76 @@ let FairNetCallBack = {}; let callBackId = 0; -class FairNet { - - static GET = 'GET'; - static POST = 'POST'; - - static requestData(req) { - let respMap = {}; - let id = 'FairNet$' + (callBackId++); - // 设置回调 - let reqFunc = {}; - if (req.complete) { - reqFunc['complete'] = req.complete; - } - if (req.success) { - reqFunc['success'] = req.success; - } - if (req.failure) { - reqFunc['failure'] = req.failure; - } - FairNetCallBack[id] = reqFunc; - // 处理参数 - let method = ''; - if (req.method) { - method = req.method; - } - let url = ''; - if (req.url) { - url = req.url; - } - let data = {}; - if (req.data) { - data = mapOrSetToObject(req.data); - } - let reqMap = { - pageName: '#FairKey#', - funcName: 'invokePlugin', - 'className': 'FairNet#requestData', - args: { - callId: id, - method: method, - url: url, - data: data - } - }; - invokeFlutterCommonChannel(JSON.stringify(reqMap), (resultStr) =>{ - let responseMap = JSON.parse(resultStr); - let data = responseMap['data']; - responseMap['data'] = data.data; - let id = responseMap['callId']; - //处理需要返回的结果值 - let callback = FairNetCallBack[id]; - if (callback == null) { - return - } - let complete = callback['complete']; - let failure = callback['failure']; - let success = callback['success']; - if (responseMap['statusCode'] === 200) { - if (complete != null) { - complete(); - } - if (success != null) { - success(convertObjectLiteralToSetOrMap(responseMap)); - } - } else { - if (complete != null) { - complete(); - } - if (failure != null) { - failure(responseMap['statusMessage']); - } - } - }) - } +const FairNet = { + GET: 'GET', + POST: 'POST', + requestData: function (req) { + let respMap = {}; + let id = 'FairNet$' + (callBackId++); + // 设置回调 + let reqFunc = {}; + if (req.complete) { + reqFunc['complete'] = req.complete; + } + if (req.success) { + reqFunc['success'] = req.success; + } + if (req.failure) { + reqFunc['failure'] = req.failure; + } + FairNetCallBack[id] = reqFunc; + // 处理参数 + let method = ''; + if (req.method) { + method = req.method; + } + let url = ''; + if (req.url) { + url = req.url; + } + let data = {}; + if (req.data) { + data = mapOrSetToObject(req.data); + } + let reqMap = { + pageName: '#FairKey#', + funcName: 'invokePlugin', + 'className': 'FairNet#requestData', + args: { + callId: id, + method: method, + url: url, + data: data + } + }; + invokeFlutterCommonChannel(JSON.stringify(reqMap), (resultStr) => { + let responseMap = JSON.parse(resultStr); + let data = responseMap['data']; + responseMap['data'] = data.data; + let id = responseMap['callId']; + //处理需要返回的结果值 + let callback = FairNetCallBack[id]; + if (callback == null) { + return + } + let complete = callback['complete']; + let failure = callback['failure']; + let success = callback['success']; + if (responseMap['statusCode'] === 200) { + if (complete != null) { + complete(); + } + if (success != null) { + success(convertObjectLiteralToSetOrMap(responseMap)); + } + } else { + if (complete != null) { + complete(); + } + if (failure != null) { + failure(responseMap['statusMessage']); + } + } + }) + } } \ No newline at end of file diff --git a/fair_extension/assets/plugin/fair_permission.js b/fair_extension/assets/plugin/fair_permission.js index 659b9626..7d1d81dd 100644 --- a/fair_extension/assets/plugin/fair_permission.js +++ b/fair_extension/assets/plugin/fair_permission.js @@ -1,57 +1,55 @@ let FairPermissionCallback = {}; let FairPermissionId = 1; -class FairPermission { - - static permissionPhoto = "Permission_Photo"; - static permissionPhone = "Permission_Phone"; - static permissionAudio = "Permission_Audio"; - - static requestPermission(req) { - let selectorId = 'FairPermissionId' + FairPermissionId++; - // 设置回调 - let reqFunc = {}; - if (req.granted) { - reqFunc['granted'] = req.granted; - } - if (req.restricted) { - reqFunc['restricted'] = req.restricted; - } - FairPermissionCallback[selectorId] = reqFunc; - let typeP = ''; - if (req.type) { - typeP = req.type; - } - let reqMap = { - pageName: '#FairKey#', - funcName: 'invokePlugin', - 'className':'FairPermission#requestPermission', - args: { - callId: selectorId, - type: typeP - } - }; - invokeFlutterCommonChannel(JSON.stringify(reqMap), function (resp) { - //处理dart端返回的请求结果 - let respMap = JSON.parse(resp); - let respArgs = respMap['args']; - let respCallId = respArgs['callId']; - let isGranted = respArgs['isGranted']; - //处理需要返回的结果值 - let callback = FairPermissionCallback[respCallId]; - if (callback == null) { - return - } - let grantedCallback = callback['granted']; - let restrictedCallback = callback['restricted']; - if (isGranted && grantedCallback != null) { - grantedCallback(); - } else { - if (restrictedCallback != null) { - restrictedCallback(); - } - } - //移除回调 - FairPermissionCallback[respCallId] = null; - }); +const FairPermission = { + permissionPhoto: "Permission_Photo", + permissionPhone: "Permission_Phone", + permissionAudio: "permissionAudio", + requestPermission: function (req) { + let selectorId = 'FairPermissionId' + FairPermissionId++; + // 设置回调 + let reqFunc = {}; + if (req.granted) { + reqFunc['granted'] = req.granted; + } + if (req.restricted) { + reqFunc['restricted'] = req.restricted; + } + FairPermissionCallback[selectorId] = reqFunc; + let typeP = ''; + if (req.type) { + typeP = req.type; + } + let reqMap = { + pageName: '#FairKey#', + funcName: 'invokePlugin', + 'className': 'FairPermission#requestPermission', + args: { + callId: selectorId, + type: typeP + } + }; + invokeFlutterCommonChannel(JSON.stringify(reqMap), function (resp) { + //处理dart端返回的请求结果 + let respMap = JSON.parse(resp); + let respArgs = respMap['args']; + let respCallId = respArgs['callId']; + let isGranted = respArgs['isGranted']; + //处理需要返回的结果值 + let callback = FairPermissionCallback[respCallId]; + if (callback == null) { + return + } + let grantedCallback = callback['granted']; + let restrictedCallback = callback['restricted']; + if (isGranted && grantedCallback != null) { + grantedCallback(); + } else { + if (restrictedCallback != null) { + restrictedCallback(); + } + } + //移除回调 + FairPermissionCallback[respCallId] = null; + }); } } \ No newline at end of file diff --git a/fair_extension/assets/plugin/fair_toast_plugin.js b/fair_extension/assets/plugin/fair_toast_plugin.js index 29d92da7..de3f346d 100644 --- a/fair_extension/assets/plugin/fair_toast_plugin.js +++ b/fair_extension/assets/plugin/fair_toast_plugin.js @@ -32,24 +32,24 @@ class FairToast { } -class Toast { - static LENGTH_SHORT = "LENGTH_SHORT"; - static LENGTH_LONG = "LENGTH_LONG"; -} +const Toast = { + LENGTH_SHORT: "LENGTH_SHORT", + LENGTH_LONG: "LENGTH_LONG", +}; -class ToastGravity { - static TOP = "TOP"; - static BOTTOM = "BOTTOM"; - static CENTER = "CENTER"; - static TOP_LEFT = "TOP_LEFT"; - static TOP_RIGHT = "TOP_RIGHT"; - static BOTTOM_LEFT = "BOTTOM_LEFT"; - static BOTTOM_RIGHT = "BOTTOM_RIGHT"; - static CENTER_LEFT = "CENTER_LEFT"; - static CENTER_RIGHT = "CENTER_RIGHT"; - static SNACKBAR = "SNACKBAR"; - static NONE = "NONE"; -} +const ToastGravity = { + TOP: "TOP", + BOTTOM: "BOTTOM", + CENTER: "CENTER", + TOP_LEFT: "TOP_LEFT", + TOP_RIGHT: "TOP_RIGHT", + BOTTOM_LEFT: "BOTTOM_LEFT", + BOTTOM_RIGHT: "BOTTOM_RIGHT", + CENTER_LEFT: "CENTER_LEFT", + CENTER_RIGHT: "CENTER_RIGHT", + SNACKBAR: "SNACKBAR", + NONE: "NONE", +}; function Color(color){ return color; From aa49b4cac8737256346c7be2c40f84fd8f088e4b Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 16:34:01 +0800 Subject: [PATCH 21/44] example optimize --- fair_provider/example/lib/main.dart | 139 ++++++------------ .../example/lib/ui/counter_page.dart | 2 +- .../example/lib/ui/example_page.dart | 4 +- .../example/lib/ui/example_page2.dart | 23 ++- 4 files changed, 53 insertions(+), 115 deletions(-) diff --git a/fair_provider/example/lib/main.dart b/fair_provider/example/lib/main.dart index 1964cb0e..f8aa0d57 100644 --- a/fair_provider/example/lib/main.dart +++ b/fair_provider/example/lib/main.dart @@ -22,7 +22,7 @@ void main() { } class MyApp extends StatelessWidget { - const MyApp({super.key}); + const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -31,51 +31,46 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: - // MyHomePage(title: "dasdasdsa",), - Scaffold( - appBar: AppBar( - title: const Text('Flutter Lab'), - ), - body: Builder( - builder: (context) => ListView( - children: [ - addItem("计数器示例", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_counter_page", - path: - "assets/fair/lib_ui_counter_page.fair.json", - ), - )); - }), - addItem("基本使用示例", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_example_page", - path: - "assets/fair/lib_ui_example_page.fair.json", - ), - )); - }), - addItem("跨页面共享状态", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_example_page2", - path: - "assets/fair/lib_ui_example_page2.fair.json", - ), - )); - }), - ], - ), - ))); + home: Scaffold( + appBar: AppBar( + title: const Text('Flutter Lab'), + ), + body: Builder( + builder: (context) => ListView( + children: [ + addItem("计数器示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_counter_page", + path: "assets/fair/lib_ui_counter_page.fair.json", + ), + )); + }), + addItem("基本使用示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_example_page", + path: "assets/fair/lib_ui_example_page.fair.json", + ), + )); + }), + addItem("跨页面共享状态", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_example_page2", + path: "assets/fair/lib_ui_example_page2.fair.json", + ), + )); + }), + ], + ), + ))); } } @@ -102,55 +97,3 @@ Widget addItem(String itemName, dynamic onPress) { textAlign: TextAlign.left, ))); } - -class MyHomePage extends StatefulWidget { - const MyHomePage({super.key, required this.title}); - - final String title; - - @override - State createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - int _counter = 0; - - void _incrementCounter() { - setState(() { - _counter++; - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(widget.title), - ), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'You have pushed the button this many times:', - ), - Text( - '$_counter', - style: Theme.of(context).textTheme.headlineMedium, - ), - test(), - ], - ), - ), - floatingActionButton: FloatingActionButton( - onPressed: _incrementCounter, - tooltip: 'Increment', - child: const Icon(Icons.add), - ), - ); - } - - Widget test() { - return Container(); - } -} diff --git a/fair_provider/example/lib/ui/counter_page.dart b/fair_provider/example/lib/ui/counter_page.dart index 036bd9de..2adb95d9 100644 --- a/fair_provider/example/lib/ui/counter_page.dart +++ b/fair_provider/example/lib/ui/counter_page.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; @FairPatch() class CounterPage extends StatefulWidget { - const CounterPage({super.key}); + const CounterPage({Key? key}) : super(key: key); @override State createState() => _CounterPageState(); diff --git a/fair_provider/example/lib/ui/example_page.dart b/fair_provider/example/lib/ui/example_page.dart index 0dabe8dd..5f8a3ca4 100644 --- a/fair_provider/example/lib/ui/example_page.dart +++ b/fair_provider/example/lib/ui/example_page.dart @@ -1,5 +1,3 @@ -import 'dart:math'; - import 'package:example/entity/example_model.dart'; import 'package:fair/fair.dart'; import 'package:fair_provider/fair_provider.dart'; @@ -7,7 +5,7 @@ import 'package:flutter/material.dart'; @FairPatch() class ExamplePage extends StatefulWidget { - const ExamplePage({super.key}); + const ExamplePage({Key? key}) : super(key: key); @override State createState() => _ExamplePageState(); diff --git a/fair_provider/example/lib/ui/example_page2.dart b/fair_provider/example/lib/ui/example_page2.dart index 931618a0..be3c9103 100644 --- a/fair_provider/example/lib/ui/example_page2.dart +++ b/fair_provider/example/lib/ui/example_page2.dart @@ -1,4 +1,3 @@ -import 'package:example/entity/counter_model.dart'; import 'package:example/entity/top_model.dart'; import 'package:fair/fair.dart'; import 'package:fair_provider/fair_provider.dart'; @@ -6,7 +5,7 @@ import 'package:flutter/material.dart'; @FairPatch() class ExamplePage2 extends StatefulWidget { - const ExamplePage2({super.key}); + const ExamplePage2({Key? key}) : super(key: key); @override State createState() => _ExamplePage2State(); @@ -39,22 +38,20 @@ class _ExamplePage2State extends State { '监听TopModel中的intFiled:', ), FairConsumer( - builder: SugarProvider.consumerBuilder( - (context, value, child) => - Text(SugarProvider.readAsString(value, 'intField'))), + builder: SugarProvider.consumerBuilder((context, value, child) => + Text(SugarProvider.readAsString(value, 'intField'))), ), ], ), ), floatingActionButton: FairContextBuilder( - builder: - SugarProvider.widgetBuilder((context) => FloatingActionButton( - onPressed: () { - _incrementCounter(context); - }, - tooltip: 'Increment', - child: const Icon(Icons.add), - )), + builder: SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), ), ); } From 469dc25bff3b3f4b889abb65b6f34f86efcc962f Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 17:15:53 +0800 Subject: [PATCH 22/44] example optimize --- fair_provider/example/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fair_provider/example/pubspec.yaml b/fair_provider/example/pubspec.yaml index aab22396..8998a9af 100644 --- a/fair_provider/example/pubspec.yaml +++ b/fair_provider/example/pubspec.yaml @@ -27,7 +27,7 @@ dev_dependencies: dependency_overrides: collection: 1.17.0 fair_version: - path: ../../../fair/flutter_version/flutter_3_7_0 + path: ../../../fair/flutter_version/flutter_3_10_0 fair_compiler: path: ../../../fair/compiler fair_dart2dsl: From 1f1e1301dc7115dd8dcef4ef40096131a380ef7b Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 19:02:12 +0800 Subject: [PATCH 23/44] fair_version update --- flutter_version/flutter_3_10_0/pubspec.yaml | 2 +- flutter_version/flutter_3_13_0/pubspec.yaml | 2 +- flutter_version/flutter_3_3_0/pubspec.yaml | 2 +- flutter_version/flutter_3_7_0/pubspec.yaml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flutter_version/flutter_3_10_0/pubspec.yaml b/flutter_version/flutter_3_10_0/pubspec.yaml index 2bba7035..4a0ee4b1 100644 --- a/flutter_version/flutter_3_10_0/pubspec.yaml +++ b/flutter_version/flutter_3_10_0/pubspec.yaml @@ -1,5 +1,5 @@ name: fair_version -description: Fair binding for Flutter v3.0.0 +description: Fair binding for Flutter v3.10.0 version: 3.10.0 homepage: https://fair.58.com/ diff --git a/flutter_version/flutter_3_13_0/pubspec.yaml b/flutter_version/flutter_3_13_0/pubspec.yaml index 9b611cb2..e8336eda 100644 --- a/flutter_version/flutter_3_13_0/pubspec.yaml +++ b/flutter_version/flutter_3_13_0/pubspec.yaml @@ -1,5 +1,5 @@ name: fair_version -description: Fair binding for Flutter v3.0.0 +description: Fair binding for Flutter v3.13.0 version: 3.13.0 homepage: https://fair.58.com/ diff --git a/flutter_version/flutter_3_3_0/pubspec.yaml b/flutter_version/flutter_3_3_0/pubspec.yaml index 1514602e..52526847 100644 --- a/flutter_version/flutter_3_3_0/pubspec.yaml +++ b/flutter_version/flutter_3_3_0/pubspec.yaml @@ -1,5 +1,5 @@ name: fair_version -description: Fair binding for Flutter v3.0.0 +description: Fair binding for Flutter v3.3.0 version: 3.3.0 homepage: https://fair.58.com/ diff --git a/flutter_version/flutter_3_7_0/pubspec.yaml b/flutter_version/flutter_3_7_0/pubspec.yaml index 070ec95a..0b68f151 100644 --- a/flutter_version/flutter_3_7_0/pubspec.yaml +++ b/flutter_version/flutter_3_7_0/pubspec.yaml @@ -1,5 +1,5 @@ name: fair_version -description: Fair binding for Flutter v3.0.0 +description: Fair binding for Flutter v3.7.0 version: 3.7.0 homepage: https://fair.58.com/ From 44aa031cc29260ec0a98a10bcd22af0118932e0b Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 19:22:23 +0800 Subject: [PATCH 24/44] publish fair_compiler 1.9.0 --- compiler/CHANGELOG.md | 5 +++++ compiler/pubspec.yaml | 6 +++--- dart2dsl/CHANGELOG.md | 5 +++++ dart2dsl/pubspec.yaml | 2 +- dart2js/CHANGELOG.md | 3 +++ dart2js/pubspec.yaml | 2 +- 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/compiler/CHANGELOG.md b/compiler/CHANGELOG.md index f187bcc0..0bef48a3 100644 --- a/compiler/CHANGELOG.md +++ b/compiler/CHANGELOG.md @@ -1,3 +1,8 @@ +## [1.9.0] +* Support TypeArgumentList. +* Support negative value. +* Fix js isNotEmpty bug. + ## [1.8.0] * Compiler log optimized. diff --git a/compiler/pubspec.yaml b/compiler/pubspec.yaml index 417f11d4..0409d99d 100644 --- a/compiler/pubspec.yaml +++ b/compiler/pubspec.yaml @@ -1,6 +1,6 @@ name: fair_compiler description: A complier which can generate Fair bundle for widget with annotation. -version: 1.8.0 +version: 1.9.0 homepage: https://fair.58.com/ environment: @@ -28,11 +28,11 @@ dependencies: # fair_annotation: # path: ../annotation - fair_dart2dsl: ^1.4.0 + fair_dart2dsl: ^1.5.0 # fair_dart2dsl: # path: ../dart2dsl - fair_dart2js: ^1.4.0 + fair_dart2js: ^1.5.0 # fair_dart2js: # path: ../dart2js diff --git a/dart2dsl/CHANGELOG.md b/dart2dsl/CHANGELOG.md index e2817f14..f26c805c 100644 --- a/dart2dsl/CHANGELOG.md +++ b/dart2dsl/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.5.0 + +- Support TypeArgumentList. +- Support Negative Value. + ## 1.4.0 - Log optimized. diff --git a/dart2dsl/pubspec.yaml b/dart2dsl/pubspec.yaml index 2682c079..6aa07829 100644 --- a/dart2dsl/pubspec.yaml +++ b/dart2dsl/pubspec.yaml @@ -1,6 +1,6 @@ name: fair_dart2dsl description: Companion compiler for fair_compiler for converting Dart to DSL. -version: 1.4.0 +version: 1.5.0 homepage: https://fair.58.com/ environment: diff --git a/dart2js/CHANGELOG.md b/dart2js/CHANGELOG.md index e902e450..f9a2996e 100644 --- a/dart2js/CHANGELOG.md +++ b/dart2js/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.5.0 +- fix js isNotEmpty bug. + ## 1.4.0 - 升级 analyzer 版本为 5.5.0; diff --git a/dart2js/pubspec.yaml b/dart2js/pubspec.yaml index 507bf99c..b3edb5fe 100644 --- a/dart2js/pubspec.yaml +++ b/dart2js/pubspec.yaml @@ -1,6 +1,6 @@ name: fair_dart2js description: Convert individual dart file to js. -version: 1.4.0 +version: 1.5.0 homepage: https://fair.58.com/ environment: From 4807f5f2b72593a8c03ee4955336cfb7fb1f12e1 Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 19:34:20 +0800 Subject: [PATCH 25/44] publish fair 3.4.0 --- fair/CHANGELOG.md | 5 +++++ fair/README.md | 4 ++-- fair/pubspec.yaml | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/fair/CHANGELOG.md b/fair/CHANGELOG.md index 4353c131..529217f9 100644 --- a/fair/CHANGELOG.md +++ b/fair/CHANGELOG.md @@ -1,3 +1,8 @@ +## [3.4.0] +* Publish Fair Provider; +* Adaptation to Flutter 3.13; +* Fixed some known issues. + ## [3.3.0] * Runtime log optimization, covering Dart/JS logs; * Compiler log optimization, removal of redundant/error logs, and enhanced log output; diff --git a/fair/README.md b/fair/README.md index af82a784..c88bf751 100644 --- a/fair/README.md +++ b/fair/README.md @@ -2,7 +2,7 @@

- pub + pub github doc license @@ -19,7 +19,7 @@ We create Fair so we can dispatch UI changes to users as bundle(s), the way simi Use Flutter Fair require few steps. Add dependency inside `pubspec.yaml`. ```yaml dependencies: - fair: ^3.3.0 + fair: ^3.4.0 ``` Wrap your app with FairApp Widget. diff --git a/fair/pubspec.yaml b/fair/pubspec.yaml index c30a67c6..0cb1011f 100644 --- a/fair/pubspec.yaml +++ b/fair/pubspec.yaml @@ -1,6 +1,6 @@ name: fair description: Flutter Fair is a package used to update widget dynamically. -version: 3.3.0 +version: 3.4.0 homepage: https://fair.58.com/ environment: @@ -16,7 +16,7 @@ dependencies: # fair_annotation: # path: ../annotation - fair_version: ^3.0.0 + fair_version: ^3.13.0 # fair_version: # path: ../flutter_version/flutter_2_5_0 flat_buffers: ^2.0.5 From a249f8cf087a420a0f6c4a254ad9e3c58e832cc2 Mon Sep 17 00:00:00 2001 From: wanbing01 Date: Tue, 14 Nov 2023 19:58:45 +0800 Subject: [PATCH 26/44] publish fair provider 0.0.1 --- fair_provider/CHANGELOG.md | 2 + fair_provider/LICENSE | 25 ++++++++ fair_provider/example/pubspec.lock | 86 +++++++++++++++------------ fair_provider/example/pubspec.yaml | 12 +--- fair_provider/pubspec.lock | 93 +++++++++++++++++------------- fair_provider/pubspec.yaml | 20 ++----- 6 files changed, 138 insertions(+), 100 deletions(-) create mode 100644 fair_provider/CHANGELOG.md create mode 100644 fair_provider/LICENSE diff --git a/fair_provider/CHANGELOG.md b/fair_provider/CHANGELOG.md new file mode 100644 index 00000000..e6377dda --- /dev/null +++ b/fair_provider/CHANGELOG.md @@ -0,0 +1,2 @@ +## [0.0.1+1] +* Support Provider. \ No newline at end of file diff --git a/fair_provider/LICENSE b/fair_provider/LICENSE new file mode 100644 index 00000000..9db6e925 --- /dev/null +++ b/fair_provider/LICENSE @@ -0,0 +1,25 @@ +Copyright (C) 2005-present, 58.com. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of 58.com nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/fair_provider/example/pubspec.lock b/fair_provider/example/pubspec.lock index 0337fef1..446bef6b 100644 --- a/fair_provider/example/pubspec.lock +++ b/fair_provider/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" boolean_selector: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" checked_yaml: dependency: transitive description: @@ -188,10 +188,11 @@ packages: fair: dependency: "direct main" description: - path: "../../fair" - relative: true - source: path - version: "3.3.0" + name: fair + sha256: d05710b2018a693d37cad3d409c304e9aaa54d3fa3787d3d38fff812b32f7926 + url: "https://pub.dev" + source: hosted + version: "3.4.0" fair_annotation: dependency: transitive description: @@ -203,39 +204,42 @@ packages: fair_compiler: dependency: "direct dev" description: - path: "../../compiler" - relative: true - source: path - version: "1.8.0" + name: fair_compiler + sha256: c4e150c065da03cd911241c474463ed7f8f0fc3f3c27714ec422045b8463e9a0 + url: "https://pub.dev" + source: hosted + version: "1.9.0" fair_dart2dsl: - dependency: "direct overridden" + dependency: transitive description: - path: "../../dart2dsl" - relative: true - source: path - version: "1.4.0" + name: fair_dart2dsl + sha256: "218ec6b805b192769ff5186d394b4ab77f065494c9b47c9a08515632df4a49fd" + url: "https://pub.dev" + source: hosted + version: "1.5.0" fair_dart2js: dependency: transitive description: name: fair_dart2js - sha256: f9b14f1fc887866238fb0c446667611bcd8896f889cd18950ce4b3cd7a3cfad2 + sha256: df0951b6ef28a993b1807924eaf9ed0163daf72e8e7b17ae6776cf000608819b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" fair_provider: dependency: "direct main" description: path: ".." relative: true source: path - version: "1.0.0+1" + version: "0.0.1+1" fair_version: dependency: "direct overridden" description: - path: "../../flutter_version/flutter_3_7_0" - relative: true - source: path - version: "3.7.0" + name: fair_version + sha256: e2f9985ec5d248553ff43dfb289cae3170667c37a6281c74663ed4c2b8e693c6 + url: "https://pub.dev" + source: hosted + version: "3.10.0" fake_async: dependency: transitive description: @@ -399,26 +403,26 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: @@ -447,10 +451,10 @@ packages: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" pedantic: dependency: transitive description: @@ -556,10 +560,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: @@ -604,10 +608,10 @@ packages: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.6.0" timing: dependency: transitive description: @@ -704,6 +708,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -721,5 +733,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=2.19.6 <3.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=3.7.0" diff --git a/fair_provider/example/pubspec.yaml b/fair_provider/example/pubspec.yaml index 8998a9af..794586f7 100644 --- a/fair_provider/example/pubspec.yaml +++ b/fair_provider/example/pubspec.yaml @@ -14,24 +14,18 @@ dependencies: fair_provider: path: ../../fair_provider - fair: - path: ../../../fair/fair + fair: ^3.4.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 build_runner: ^2.1.2 - fair_compiler: ^1.8.0 + fair_compiler: ^1.9.0 dependency_overrides: collection: 1.17.0 - fair_version: - path: ../../../fair/flutter_version/flutter_3_10_0 - fair_compiler: - path: ../../../fair/compiler - fair_dart2dsl: - path: ../../../fair/dart2dsl + fair_version: 3.10.0 flutter: uses-material-design: true diff --git a/fair_provider/pubspec.lock b/fair_provider/pubspec.lock index eb5006a5..88e3bcc5 100644 --- a/fair_provider/pubspec.lock +++ b/fair_provider/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" boolean_selector: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" checked_yaml: dependency: transitive description: @@ -146,7 +146,7 @@ packages: source: hosted version: "4.7.0" collection: - dependency: "direct overridden" + dependency: "direct main" description: name: collection sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 @@ -188,10 +188,11 @@ packages: fair: dependency: "direct main" description: - path: "../fair" - relative: true - source: path - version: "3.3.0" + name: fair + sha256: d05710b2018a693d37cad3d409c304e9aaa54d3fa3787d3d38fff812b32f7926 + url: "https://pub.dev" + source: hosted + version: "3.4.0" fair_annotation: dependency: transitive description: @@ -203,31 +204,35 @@ packages: fair_compiler: dependency: "direct dev" description: - path: "../compiler" - relative: true - source: path - version: "1.8.0" + name: fair_compiler + sha256: c4e150c065da03cd911241c474463ed7f8f0fc3f3c27714ec422045b8463e9a0 + url: "https://pub.dev" + source: hosted + version: "1.9.0" fair_dart2dsl: - dependency: "direct overridden" + dependency: transitive description: - path: "../dart2dsl" - relative: true - source: path - version: "1.4.0" + name: fair_dart2dsl + sha256: "218ec6b805b192769ff5186d394b4ab77f065494c9b47c9a08515632df4a49fd" + url: "https://pub.dev" + source: hosted + version: "1.5.0" fair_dart2js: - dependency: "direct overridden" + dependency: transitive description: - path: "../dart2js" - relative: true - source: path - version: "1.4.0" + name: fair_dart2js + sha256: df0951b6ef28a993b1807924eaf9ed0163daf72e8e7b17ae6776cf000608819b + url: "https://pub.dev" + source: hosted + version: "1.5.0" fair_version: dependency: "direct overridden" description: - path: "../flutter_version/flutter_3_7_0" - relative: true - source: path - version: "3.7.0" + name: fair_version + sha256: e2f9985ec5d248553ff43dfb289cae3170667c37a6281c74663ed4c2b8e693c6 + url: "https://pub.dev" + source: hosted + version: "3.10.0" fake_async: dependency: transitive description: @@ -391,26 +396,26 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: @@ -439,10 +444,10 @@ packages: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" pedantic: dependency: transitive description: @@ -548,10 +553,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" stack_trace: dependency: transitive description: @@ -596,10 +601,10 @@ packages: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.6.0" timing: dependency: transitive description: @@ -696,6 +701,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -713,5 +726,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=2.19.0 <3.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=3.7.0" diff --git a/fair_provider/pubspec.yaml b/fair_provider/pubspec.yaml index 38a9b688..551b85de 100644 --- a/fair_provider/pubspec.yaml +++ b/fair_provider/pubspec.yaml @@ -1,7 +1,7 @@ name: fair_provider description: An extension library for Fair on the Provider framework. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.0.0+1 +homepage: https://fair.58.com/ +version: 0.0.1+1 environment: sdk: ">=2.12.0 <4.0.0" @@ -11,28 +11,20 @@ dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 - # fair: 3.3.0 - fair: - path: ../../fair/fair + fair: ^3.4.0 provider: ^6.0.5 + collection: 1.7.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 build_runner: ^2.1.2 - fair_compiler: ^1.8.0 + fair_compiler: ^1.9.0 dependency_overrides: collection: 1.17.0 - fair_version: - path: ../../fair/flutter_version/flutter_3_7_0 - fair_dart2dsl: - path: ../../fair/dart2dsl - fair_dart2js: - path: ../../fair/dart2js - fair_compiler: - path: ../../fair/compiler + fair_version: 3.10.0 flutter: uses-material-design: true From 539d659bfaec1860b3cd586ef0c1610dc6efafa3 Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Wed, 15 Nov 2023 20:16:42 +0800 Subject: [PATCH 27/44] [feature] optimize example --- fair_provider/README.md | 3 + .../assets/fair/lib_ui_counter_page.fair.json | 2 +- .../fair/lib_ui_counter_page.fair.metadata | 6 +- .../assets/fair/lib_ui_example_page.fair.json | 2 +- .../fair/lib_ui_example_page.fair.metadata | 6 +- .../fair/lib_ui_example_page2.fair.json | 93 ++++++++++----- .../fair/lib_ui_example_page2.fair.metadata | 6 +- .../assets/fair/lib_ui_second_page.fair.js | 1 + .../assets/fair/lib_ui_second_page.fair.json | 111 ++++++++++++++++++ .../fair/lib_ui_second_page.fair.metadata | 7 ++ .../example/lib/entity/top_model.dart | 1 - fair_provider/example/lib/main.dart | 93 +++++++++------ .../example/lib/ui/example_page2.dart | 27 +++-- fair_provider/example/lib/ui/second_page.dart | 67 +++++++++++ fair_provider/example/pubspec.lock | 42 +++---- 15 files changed, 353 insertions(+), 114 deletions(-) create mode 100644 fair_provider/example/assets/fair/lib_ui_second_page.fair.js create mode 100644 fair_provider/example/assets/fair/lib_ui_second_page.fair.json create mode 100644 fair_provider/example/assets/fair/lib_ui_second_page.fair.metadata create mode 100644 fair_provider/example/lib/ui/second_page.dart diff --git a/fair_provider/README.md b/fair_provider/README.md index 2d119977..2036f63d 100644 --- a/fair_provider/README.md +++ b/fair_provider/README.md @@ -74,8 +74,11 @@ class CounterModel extends FairChangeNotifier { 注意read函数的泛型即是状态管理类的类型,参数需要手动输入该类的字符串 ```dart void _incrementCounter(FairContext context) { + //通过FairContext获取状态对象 var counterModel = context.read("CounterModel"); + //修改对象中的value counterModel.count++; + //调用notify通知观察者 counterModel.notify(); } ``` diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json index a069de0d..76f4da09 100644 --- a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.json @@ -152,5 +152,5 @@ "CounterModel" ], "methodMap": {}, - "digest": "2a50f76be88274617782a4aaf287fae5" + "digest": "9a57f6332184336987ce97b19ff50c9d" } \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata index 04d5a236..31c03c65 100644 --- a/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_counter_page.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-07 10:58:27.291068. +# Generated by Fair on 2023-11-15 20:13:27.284796. source: example|lib/ui/counter_page.dart -md5: d2e3f3306a431e152fa405978c7ff341 +md5: 819e54e126cf41cbf9f2d9b7b8bd1042 json: example|build/fair/lib_ui_counter_page.fair.json bin: example|build/fair/lib_ui_counter_page.fair.bin -date: 2023-11-07 10:58:27.291284 +date: 2023-11-15 20:13:27.285044 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.json b/fair_provider/example/assets/fair/lib_ui_example_page.fair.json index 14d979ee..b3c1ac34 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page.fair.json +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.json @@ -863,5 +863,5 @@ "ExampleModel" ], "methodMap": {}, - "digest": "e892fd0f6f5e2dd8e7bf13ebf6525b34" + "digest": "4822d9ccf383c2962f94493efc6197ac" } \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata index 7f354866..a311a09b 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_example_page.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-07 10:58:27.258829. +# Generated by Fair on 2023-11-15 20:13:27.343253. source: example|lib/ui/example_page.dart -md5: df9a174788a4cad9b1e55169ba5e5dcf +md5: 1985fff1986e3c121d13b7b1aab62b59 json: example|build/fair/lib_ui_example_page.fair.json bin: example|build/fair/lib_ui_example_page.fair.bin -date: 2023-11-07 10:58:27.259251 +date: 2023-11-15 20:13:27.343627 diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json index dd0969fb..072b0a65 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.json @@ -7,7 +7,7 @@ "title": { "className": "Text", "pa": [ - "跨组件共享状态" + "状态共享-页面1" ] } } @@ -21,42 +21,73 @@ "mainAxisAlignment": "#(MainAxisAlignment.center)", "children": [ { - "className": "Text", - "pa": [ - "监听TopModel中的intFiled:" - ] - }, - { - "className": "FairConsumer", + "className": "Row", "na": { - "builder": { - "className": "SugarProvider.consumerBuilder", - "pa": [ - { - "className": "Text", - "pa": [ - { - "className": "SugarProvider.readAsString", - "pa": [ - "^(value)", - "intField" - ] - } - ], - "functionParameters": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Text", + "pa": [ + "监听TopModel中的intFiled:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", "pa": [ - "context", - "value", - "child" + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "intField" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } ] } + }, + "typeArgumentList": [ + "TopModel" + ] + } + ] + } + }, + { + "className": "ElevatedButton", + "na": { + "onPressed": { + "className": "Navigator.pushNamed", + "pa": [ + "^(context)", + "fair_page_two" + ], + "na": { + "arguments": { + "path": "assets/fair/lib_ui_second_page.fair.json" } + } + }, + "child": { + "className": "Text", + "pa": [ + "点击跳转二级页面" ] } - }, - "typeArgumentList": [ - "TopModel" - ] + } } ] } @@ -93,5 +124,5 @@ } }, "methodMap": {}, - "digest": "2411e8da388fc4af26fa00d0278de484" + "digest": "fa93eea4a8aed0095b7cd960eb827e9e" } \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata index 2bd5af1b..ef4f036e 100644 --- a/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata +++ b/fair_provider/example/assets/fair/lib_ui_example_page2.fair.metadata @@ -1,7 +1,7 @@ -# Generated by Fair on 2023-11-07 10:58:27.306859. +# Generated by Fair on 2023-11-15 20:13:27.329194. source: example|lib/ui/example_page2.dart -md5: 7e0452e2e8e8d84789b198debd6035da +md5: cf9cb059b5cb15a1f911fbd4dc02e0a5 json: example|build/fair/lib_ui_example_page2.fair.json bin: example|build/fair/lib_ui_example_page2.fair.bin -date: 2023-11-07 10:58:27.307047 +date: 2023-11-15 20:13:27.329383 diff --git a/fair_provider/example/assets/fair/lib_ui_second_page.fair.js b/fair_provider/example/assets/fair/lib_ui_second_page.fair.js new file mode 100644 index 00000000..70cb977f --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_second_page.fair.js @@ -0,0 +1 @@ +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _SecondPageState(){const inner=_SecondPageState.__inner__;if(this==__global__){return new _SecondPageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_SecondPageState.prototype.ctor.apply(this,args);return this;}}_SecondPageState.__inner__=function inner(){};_SecondPageState.prototype={onLoad:function onLoad(){const __thiz__=this;with(__thiz__){}},onUnload:function onUnload(){const __thiz__=this;with(__thiz__){}},_incrementCounter:function _incrementCounter(context){const __thiz__=this;const __arg_ctx__={context,};with(__thiz__){with(__arg_ctx__){let topModel=context.read("TopModel");topModel.intField++;topModel.notify();}}},};_SecondPageState.prototype.ctor=function(){};;return _SecondPageState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_second_page.fair.json b/fair_provider/example/assets/fair/lib_ui_second_page.fair.json new file mode 100644 index 00000000..4b2e1aed --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_second_page.fair.json @@ -0,0 +1,111 @@ +{ + "className": "Scaffold", + "na": { + "appBar": { + "className": "AppBar", + "na": { + "title": { + "className": "Text", + "pa": [ + "状态共享-页面2" + ] + } + } + }, + "body": { + "className": "Container", + "na": { + "color": "#(Colors.white)", + "child": { + "className": "Center", + "na": { + "child": { + "className": "Column", + "na": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Row", + "na": { + "mainAxisAlignment": "#(MainAxisAlignment.center)", + "children": [ + { + "className": "Text", + "pa": [ + "监听TopModel中的intFiled:" + ] + }, + { + "className": "FairConsumer", + "na": { + "builder": { + "className": "SugarProvider.consumerBuilder", + "pa": [ + { + "className": "Text", + "pa": [ + { + "className": "SugarProvider.readAsString", + "pa": [ + "^(value)", + "intField" + ] + } + ], + "functionParameters": { + "pa": [ + "context", + "value", + "child" + ] + } + } + ] + } + }, + "typeArgumentList": [ + "TopModel" + ] + } + ] + } + } + ] + } + } + } + } + } + }, + "floatingActionButton": { + "className": "FairContextBuilder", + "na": { + "builder": { + "className": "SugarProvider.widgetBuilder", + "pa": [ + { + "className": "FloatingActionButton", + "na": { + "onPressed": "@(_incrementCounter(^(context)))", + "tooltip": "Increment", + "child": { + "className": "Icon", + "pa": [ + "#(Icons.add)" + ] + } + }, + "functionParameters": { + "pa": [ + "context" + ] + } + } + ] + } + } + } + }, + "methodMap": {}, + "digest": "5e7cd6297fd4cca54ff47dc3369bc035" +} \ No newline at end of file diff --git a/fair_provider/example/assets/fair/lib_ui_second_page.fair.metadata b/fair_provider/example/assets/fair/lib_ui_second_page.fair.metadata new file mode 100644 index 00000000..8015e0ea --- /dev/null +++ b/fair_provider/example/assets/fair/lib_ui_second_page.fair.metadata @@ -0,0 +1,7 @@ +# Generated by Fair on 2023-11-15 20:13:27.313370. + +source: example|lib/ui/second_page.dart +md5: e011b307244623677adc6f1adfde4c0b +json: example|build/fair/lib_ui_second_page.fair.json +bin: example|build/fair/lib_ui_second_page.fair.bin +date: 2023-11-15 20:13:27.313553 diff --git a/fair_provider/example/lib/entity/top_model.dart b/fair_provider/example/lib/entity/top_model.dart index 740e373c..008a0a0e 100644 --- a/fair_provider/example/lib/entity/top_model.dart +++ b/fair_provider/example/lib/entity/top_model.dart @@ -2,5 +2,4 @@ import 'package:fair_provider/fair_provider.dart'; class TopModel extends FairChangeNotifier { int intField = 1; - double doubleFiled = 0.0; } \ No newline at end of file diff --git a/fair_provider/example/lib/main.dart b/fair_provider/example/lib/main.dart index f8aa0d57..bdc986d4 100644 --- a/fair_provider/example/lib/main.dart +++ b/fair_provider/example/lib/main.dart @@ -24,6 +24,12 @@ void main() { class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); + /// 获取路由传递的参数 + dynamic _getParams(BuildContext context, String key) => + (ModalRoute.of(context)?.settings.arguments is Map) + ? (ModalRoute.of(context)?.settings.arguments as Map)[key] + : null; + @override Widget build(BuildContext context) { return MaterialApp( @@ -31,46 +37,55 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: Scaffold( - appBar: AppBar( - title: const Text('Flutter Lab'), - ), - body: Builder( - builder: (context) => ListView( - children: [ - addItem("计数器示例", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_counter_page", - path: "assets/fair/lib_ui_counter_page.fair.json", - ), - )); - }), - addItem("基本使用示例", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_example_page", - path: "assets/fair/lib_ui_example_page.fair.json", - ), - )); - }), - addItem("跨页面共享状态", () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => FairWidget( - name: "lib_ui_example_page2", - path: "assets/fair/lib_ui_example_page2.fair.json", - ), - )); - }), - ], + routes: { + 'fair_page_two': (context) => FairWidget( + path: _getParams(context, 'path'), ), - ))); + }, + home: + Scaffold( + appBar: AppBar( + title: const Text('Flutter Lab'), + ), + body: Builder( + builder: (context) => ListView( + children: [ + addItem("计数器示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_counter_page", + path: + "assets/fair/lib_ui_counter_page.fair.json", + ), + )); + }), + addItem("基本使用示例", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_example_page", + path: + "assets/fair/lib_ui_example_page.fair.json", + ), + )); + }), + addItem("跨页面共享状态", () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => FairWidget( + name: "lib_ui_example_page2", + path: + "assets/fair/lib_ui_example_page2.fair.json", + ), + )); + }), + ], + ), + ))); } } diff --git a/fair_provider/example/lib/ui/example_page2.dart b/fair_provider/example/lib/ui/example_page2.dart index be3c9103..7734a7f1 100644 --- a/fair_provider/example/lib/ui/example_page2.dart +++ b/fair_provider/example/lib/ui/example_page2.dart @@ -27,20 +27,33 @@ class _ExamplePage2State extends State { return Scaffold( appBar: AppBar( title: const Text( - "跨组件共享状态", + "状态共享-页面1", ), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - const Text( - '监听TopModel中的intFiled:', - ), - FairConsumer( - builder: SugarProvider.consumerBuilder((context, value, child) => - Text(SugarProvider.readAsString(value, 'intField'))), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + '监听TopModel中的intFiled:', + ), + FairConsumer( + builder: SugarProvider.consumerBuilder( + (context, value, child) => + Text(SugarProvider.readAsString(value, 'intField'))), + ), + ], ), + ElevatedButton( + onPressed: () { + Navigator.pushNamed(context, 'fair_page_two', arguments: { + 'path': 'assets/fair/lib_ui_second_page.fair.json', + }); + }, + child: const Text("点击跳转二级页面")), ], ), ), diff --git a/fair_provider/example/lib/ui/second_page.dart b/fair_provider/example/lib/ui/second_page.dart new file mode 100644 index 00000000..2b2ba895 --- /dev/null +++ b/fair_provider/example/lib/ui/second_page.dart @@ -0,0 +1,67 @@ +import 'package:example/entity/top_model.dart'; +import 'package:fair/fair.dart'; +import 'package:fair_provider/fair_provider.dart'; +import 'package:flutter/material.dart'; + +@FairPatch() +class SecondPage extends StatefulWidget { + const SecondPage({Key? key}) : super(key: key); + + @override + State createState() => _SecondPageState(); +} + +class _SecondPageState extends State { + void onLoad() {} + + void onUnload() {} + + void _incrementCounter(FairContext context) { + var topModel = context.read("TopModel"); + topModel.intField++; + topModel.notify(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text( + "状态共享-页面2", + ), + ), + body: Container( + color: Colors.white, + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + '监听TopModel中的intFiled:', + ), + FairConsumer( + builder: SugarProvider.consumerBuilder((context, value, + child) => + Text(SugarProvider.readAsString(value, 'intField'))), + ), + ], + ), + ], + ), + ), + ), + floatingActionButton: FairContextBuilder( + builder: SugarProvider.widgetBuilder((context) => FloatingActionButton( + onPressed: () { + _incrementCounter(context); + }, + tooltip: 'Increment', + child: const Icon(Icons.add), + )), + ), + ); + } +} diff --git a/fair_provider/example/pubspec.lock b/fair_provider/example/pubspec.lock index 446bef6b..e0a66c37 100644 --- a/fair_provider/example/pubspec.lock +++ b/fair_provider/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.10.0" boolean_selector: dependency: transitive description: @@ -117,10 +117,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.1" checked_yaml: dependency: transitive description: @@ -403,26 +403,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.2.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.8.0" mime: dependency: transitive description: @@ -451,10 +451,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.8.2" pedantic: dependency: transitive description: @@ -560,10 +560,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" stack_trace: dependency: transitive description: @@ -608,10 +608,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.4.16" timing: dependency: transitive description: @@ -708,14 +708,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" - web: - dependency: transitive - description: - name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 - url: "https://pub.dev" - source: hosted - version: "0.1.4-beta" web_socket_channel: dependency: transitive description: @@ -733,5 +725,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=2.19.0 <3.0.0" flutter: ">=3.7.0" From 4aeded2824c18ef9a68833ea72d120342139b63b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E6=A5=9A?= Date: Wed, 22 Nov 2023 10:39:36 +0800 Subject: [PATCH 28/44] =?UTF-8?q?=E4=BF=AE=E5=A4=8Djs=20onLoad=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=BC=82=E6=AD=A5=E8=B0=83=E7=94=A8=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=87=BA=E7=8E=B0=E5=9C=A8parse=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E6=97=B6=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84js=E8=BF=90=E8=A1=8C=E6=97=B6?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fair/lib/src/runtime/runtime_fair_delegate.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fair/lib/src/runtime/runtime_fair_delegate.dart b/fair/lib/src/runtime/runtime_fair_delegate.dart index 1412820f..076bf7ed 100644 --- a/fair/lib/src/runtime/runtime_fair_delegate.dart +++ b/fair/lib/src/runtime/runtime_fair_delegate.dart @@ -116,7 +116,7 @@ abstract class RuntimeFairDelegate { } void didChangeDependencies() { - runtime?.invokeMethod(pageName, 'onLoad', null); + runtime?.invokeMethodSync(pageName, 'onLoad', null); } void dispose() { From 9c888bc967300434d67c77e14133d98758c14727 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Wed, 22 Nov 2023 14:07:00 +0800 Subject: [PATCH 29/44] change qr code --- resources/wechat-group-02.png | Bin 23548 -> 23706 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index 2e25f507ab47e8dcf3dd714b891741500e6d4f64..96d2d3f07a5f5009add19f897d1b730dbf4c7cf0 100644 GIT binary patch literal 23706 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 KYhG;X7X3deCV-*< literal 23548 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 Date: Fri, 22 Dec 2023 12:08:22 +0800 Subject: [PATCH 30/44] Add @woshixiaohuhu as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 3 +-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index ab540535..1f5a9689 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -220,6 +220,15 @@ "contributions": [ "code" ] + }, + { + "login": "woshixiaohuhu", + "name": "woshixiaohuhu", + "avatar_url": "https://avatars.githubusercontent.com/u/152966201?v=4", + "profile": "https://github.com/woshixiaohuhu", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index 30eb8f87..afb39ccd 100644 --- a/README.md +++ b/README.md @@ -380,8 +380,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sunlight Xie

💻
lhdycxgghb

💻
Prome

💻 - -
zmtzawqlp

💻 +
woshixiaohuhu

💻 From 65beb39e8575ec0b9914f8e82f50a16f78bcceb0 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 12:10:13 +0800 Subject: [PATCH 31/44] Add @hc2088 as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 1f5a9689..74d4e964 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -229,6 +229,15 @@ "contributions": [ "code" ] + }, + { + "login": "hc2088", + "name": "woshixiaohuhu", + "avatar_url": "https://avatars.githubusercontent.com/u/6659505?v=4", + "profile": "https://github.com/hc2088", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index afb39ccd..1ef35e83 100644 --- a/README.md +++ b/README.md @@ -382,6 +382,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Prome

💻
woshixiaohuhu

💻 + +
woshixiaohuhu

💻 + From 4bcf9f88af819bee863b7af45c0c9db877137474 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 13:59:25 +0800 Subject: [PATCH 32/44] Add @yukixut as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 74d4e964..59ca7634 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -238,6 +238,15 @@ "contributions": [ "code" ] + }, + { + "login": "yukixut", + "name": "yukixut", + "avatar_url": "https://avatars.githubusercontent.com/u/45286155?v=4", + "profile": "https://github.com/yukixut", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index 1ef35e83..ac818a64 100644 --- a/README.md +++ b/README.md @@ -384,6 +384,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
woshixiaohuhu

💻 +
yukixut

💻 From 815fecb182ddb8ac3733526e1a2e78b6a9232463 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 13:59:41 +0800 Subject: [PATCH 33/44] Add @pearone as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 59ca7634..4c66aa98 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -247,6 +247,15 @@ "contributions": [ "code" ] + }, + { + "login": "pearone", + "name": "pearone", + "avatar_url": "https://avatars.githubusercontent.com/u/23350428?v=4", + "profile": "https://github.com/pearone", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index ac818a64..4493eba8 100644 --- a/README.md +++ b/README.md @@ -385,6 +385,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
woshixiaohuhu

💻
yukixut

💻 +
pearone

💻 From a6611859b222471aba439b7f679a8f7f0dd018f5 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 13:59:52 +0800 Subject: [PATCH 34/44] Add @JOYINF1189 as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 4c66aa98..2813b867 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -256,6 +256,15 @@ "contributions": [ "code" ] + }, + { + "login": "JOYINF1189", + "name": "JOYINF1189", + "avatar_url": "https://avatars.githubusercontent.com/u/46019591?v=4", + "profile": "https://github.com/JOYINF1189", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index 4493eba8..ccf2d11c 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
woshixiaohuhu

💻
yukixut

💻
pearone

💻 +
JOYINF1189

💻 From 07370d25a13b3ebe0dc5c5e15ab79c34ff19506d Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:00:16 +0800 Subject: [PATCH 35/44] Add @Blues9527 as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 2813b867..694d4731 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -265,6 +265,15 @@ "contributions": [ "code" ] + }, + { + "login": "Blues9527", + "name": "Blues9527", + "avatar_url": "https://avatars.githubusercontent.com/u/35455720?v=4", + "profile": "https://github.com/Blues9527", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index ccf2d11c..0e586906 100644 --- a/README.md +++ b/README.md @@ -387,6 +387,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
yukixut

💻
pearone

💻
JOYINF1189

💻 +
Blues9527

💻 From 5ddfa7c93023a513a2420eec7a30db85630fbbe8 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:00:27 +0800 Subject: [PATCH 36/44] Add @miserydx as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 694d4731..6afc348b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -274,6 +274,15 @@ "contributions": [ "code" ] + }, + { + "login": "miserydx", + "name": "miserydx", + "avatar_url": "https://avatars.githubusercontent.com/u/17892391?v=4", + "profile": "https://github.com/miserydx", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index 0e586906..5dd4215a 100644 --- a/README.md +++ b/README.md @@ -388,6 +388,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
pearone

💻
JOYINF1189

💻
Blues9527

💻 +
miserydx

💻 From 75b0401987f3d8029f41ae0890b8b083b581e937 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:02:58 +0800 Subject: [PATCH 37/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dd4215a..00769fda 100644 --- a/README.md +++ b/README.md @@ -380,7 +380,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sunlight Xie

💻
lhdycxgghb

💻
Prome

💻 -
woshixiaohuhu

💻 +
zmtzawqlp

💻
woshixiaohuhu

💻 From c67da85a0df2f5ebf9e68eee133a3cdae0721210 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:11:02 +0800 Subject: [PATCH 38/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-zh.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README-zh.md b/README-zh.md index d9b3aa69..d4e0ffed 100644 --- a/README-zh.md +++ b/README-zh.md @@ -382,6 +382,14 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Prome

💻
zmtzawqlp

💻 + +
woshixiaohuhu

💻 +
yukixut

💻 +
pearone

💻 +
JOYINF1189

💻 +
Blues9527

💻 +
miserydx

💻 + From 9a83a5e112d4c4647c93d6af7383407e80102d66 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:13:25 +0800 Subject: [PATCH 39/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/wechat-group-02.png | Bin 23706 -> 23569 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index 96d2d3f07a5f5009add19f897d1b730dbf4c7cf0..37be83121fd7317d024e6399d4cf84b0d9b4b20c 100644 GIT binary patch literal 23569 zcmce;WmuF^*9JO-q=bYhAPCYeQqt0mbcZ6{-KA0@CEZ9$4c)0ow{&-R!%%0>=lA_Q z@9Up)E-x-GhIwY5XYUpFy4SsS$Xf+TEDT}{2n2#9EhVN5fgqg1f6!3CE4||jU%-FJ zrf=lmKpoZb;P5N>@+m=0{3a3Uv~I=+)~os%pGd z#YT7|ycXvWE4p97Y#n`dbC*EHAfqpD zI_OlU9)yyT5`!Fx_tB#$#3w@`!NCNrehOk@*$@;b@RtW{8TgML(fc8!1_w(aJlqr$ z6T>hRrlq7*hW!73NrtX4kqBMYlf>7Kxm%U$<5^lOoe>cYw`B|qx$?={%0wf%@)bql zS?_iy%arcFO2AUe7>c!qp}l|jxsDX-;E$#H_~n0jAiPXHzdxf{k~o!?6D-s1hwKik zQoY9mU0rOt3pKV2$_vn8E*w%GL*4}}60QujLiLGjK_ zm6tZNwaN=Nm9Sjxv*8K{-@dpyudCy({(k1OdbU5g@+3ui4b`JHmTRWdU-pjqIDHP| z`2KC%#O>;vd$VJ5<8ox9Pw2-{kKK@Ye;W%a~0M4eebUginOZ= zMr*EjD+W<^eJWfJ=FK!@yClMh3GL?2_hzz`bMa{v5?Cst|F(krRC+rWD<*HEMxtVP_-Sb;+b_!qy>JQrxG8y_5PblpYm|I9UAuL znsX%8AA-fnt+5=d41UJzRBFW_QDGj0Me;aWMOY$>#UL zOm=VPSeActBpz>zN5=Wr9V&_f0l=~n6c#eYL;ZHRZ0B{iuTOeeTVh~bpT^q0iw4PU zcpfhP{IMIMrd@6I^zg)afA+O1RCh|Xx#jj;r_z=AgTzMPKq_CBUSlwWEHFSngr=`O z{r&B6%sO&;IJCutN!+&KgpBGjFqcnbpQczV>z#MrPeAn^4RSvzgh?MvS7FxG)y1to z!_M+}n8#Ao6W@hqTlb&iK#!_0`D=#{niW)9Ww?*p8GZ6P;@Am?)LuER%k?T)W#vCE zR4*ouz2%&q0NzVgZmgTVFW)l+=i3T@{_^Gb_xrX6d`;`QS zlP`pfatAvgd@<2St6f_dHv_XNFKSfxo)4=g8Q?1J;T}itRtO|3n=~CWOMYcK@H>)1 zR4%8goFy~LmZxafmNfJ>MQtWslSzdMBQLE8rmH<{JKy7F^z6Uw*#G$`qKAY8%4b}J zcsnV2Bo^)kuZpco39xKdyw=*QYtm#x)sI^t9kCmx?J$F9eoqD%sT^*jxVgA1R zPA-*qto-(+4pcn!aex|4h4Z5UyaAVD2FFxhXQo2h7bY#3AH7k&B44xMNi zHwIFbrZiss9B6kV7;v{b*A?)FIaRvyWq#d$*Bi&2J0h`jqE8I>ucg!IYKH=4#_Hs_ zxWGEcjX0Q#k$u4*Gx=8}#akZ0%FHtMSo9m82zZ>9e()`NuXc+=%z?JGwUzs4yjX{5 zYHBL?Pe-Piob7cY=*VP~P2%^iID-~Y2W z{_ozd=PDMf7i+gV(<-J_QY}=N4kjt+jDJ=kGKnZws=vAMqN1fu?%^f{CfjztKx7K`ODLD*p0Fc+(SV=x9G1BesFyb;9=wr}3}D_;}S8$-$Kqcl?_M(F1H5?{Ui z(1j~|-YHdOF=n?tN-ulN^}bRF_;oAXv~$A7UmInckK|5PS;kYlcV=qt)>x0-iLH3) z0B`1X-6uWrk}Ve+-rTVrbLuV&ubKVN2*emVqutou*Y~j2W@o%O_vCiJ;UF?P+K9ng zUthm(to`oxI!l?RFhPJTn=5M&0&&`#9y{2fRY+k=wN+PtOw46vCY^{B%Z=x(MAOaw zVZPBFPq>x(@zYrD6n3HWNuxI>;T?DidYVd#V6nn`UXNr; z(s9LQwIgw&KockDrOTaqZtwlLvYjF(-yduwQ7@V`l9qxtz(i9Mbf+ zEVA(|oUsEtSHOoNCYkZZnQjar>-eWFaqEFuQZHYFc zUsjskPfXfaa+bXIKYH8F+jl;Dw6G7d&!LN1{nPwm9zlue z8e4M55qj)ryd3Mf*$+)&qxwxA;yGkSM<+&V&BIB8V?8TI?Jg_!47-0?b@u-SdZN)2 zCWpR6sWKZz)Ty?58OsF#R_{nj(mORhv7HyVyO+PGCE@Txv()fSe*8p%hs8*4*wQ7Q z$%(w8VrRyiPn2mTvCi*S`?(i>Zw_b4TUY4R*mU*vF^wI^88?dj3+@%J+fr#8{w|8z zcDCSk5|&@-dA=JWlc;K>N;Fe#-G;?Ii+kjSaMCF-Yt9jN%%ziSXdY%YUD@sA-Zo{! z_OqHqsx<#Y|2m14#h}^fi0gv4DNldCTIc#kx-WJi3*u}0Wn^gmHiL?}+TFkhp;O9V zTPx;j_d}Yyg}TMsoGHA{J*wJS$Km8cWGfwE71@32&l=3m<SMo)nRL0Lb^=_*s0c zQG?f&gVX-()F@ZmBk(%M57Og*1Vn4F?>bXszYFMj+UOm5%(I4#I}45j+vpZvJFX`P z?zaVEwRs*inMx-X^O}A=H@&;LirbZC8-`hlXIUCnYE}sWL&vggARzwN7=~CM!@h{8 zpiS|4={?tiU7X?99!rvJ*Z%FI^{5crP| zeQCDC@0}DHk2*+lg>=*hV>(YJbrLb*Nr>UUB_TTQnWWhDzC@MntK6KN_SI&ILR~R} z`nDh($p*AXrehcO{P@ac3ZClnNIVv!bd6`@I=Q{ZE({Wd*oxZP#Onj8mfd%_?HCG< z1^*lCisS@7eE5)I(BcEq$V_wK$Nv`X{`&G;D7iyFP1%-*|ySZp?R*nF>Ko$?CpctSQ0!qe$a~9S;j@;Rr<{Q?T9}i5;?R;rNajGQ#+flzw?nRURItZkK+Kk@Glxj z1D2h|uV{%82rXo(UV#W#U+CfI$f1;0939flo66Q(*Xg721*_WnFU?pNTu&!MmL-8H ztIx@N?W9L;n}SX`JhgVbxjcHpZIhB;$-qD+mr8t?hfW;lwe#6;T{{oeA_(8k;Jas9 zkZA44y3b6<^)ZP1GlwEllR3XNEIF7A(*1A@s+aD#;<<@;e)7+5sr0k+5{-HU%?)XZ^DSNS(1)CRRiI~C-Z;0cH>{@9!gwX`pWb=cp zDfBev_ZjUGYHde$?uS1$;6g99F;~|na@zc9_3ak>eXrxhmkxv}jRD8dp0ND$)1`d_t>82+VYnJ=*`^4$b&_UU1b?53d0(6x0UpOCnt(c zxZ*lL@s+HMglWIL6#ul5Ba(4VhZPh~@XLf~h~t9re9d%O8RIjatw7DTz+m^;-KK~P z52wEaI`Q3ABGSmK(+=nT3gWC8KJk$Io zgRi$5oFrW*u>3xYEv`z_>Zj!!r17N=L!VNzE3elVw`YQaL81Z8o%7Y&HbmDM3m|Ms4+r;4{kFf%k zo`Mw>VseDRfD$KzEt!&^I(T?2@dvFh7vqF@4dWFiifxaqV#qmXn zpT5zhB301hIH#a^gR|(;&|Le;{ky2a{Q)bLmGTJf+aodi1OB3A8_ol=$lRg)`-W8= zth|Ar_@#5vzX;|~8*Yz@@<-^GMrVZ{_N>P>Jl$Qq_JmR7m?> z?TyHHA)WG?)qXPpg#vkd3uG{lcJ0C`S7?94d*sxF_b^%?eaS`FWvO411#0sjDeFeuTy^hDw<6&-6S^_6`@H-DLv){he}KOABOsLb^5K4dUF4dj!s4 zh5~`RSD*p`im(4x8#P}4H4mHR8w!p*d@hP8!+7Y-I${8}w>{74^Zh%L&!7w%Yt^7LZw{O5yoMbgFE^S3mnm1Rm6HJvgEE?~VH z>rm5;veF3X*7%%pCHk#PV{?Y)6-XpYbx7}Oq;JZbaBJ>{{p$>*(;J_ThERS&XbR3W zkh*)!c*0fDm+{^WAkhmIoAil#Vt@JawX{qKRIfqXVfSl&(F55+c3>^Ige{mp(}aB$*u0UE83thu zNOhj7+*>x2kC8NH)#*J*^dj7s9cKI~E9&H7UH&bD$7%gx!M{4e3T0;g)cwUtGJSwO zX$5_}vu`fHBtVi>;6H0{TTA{_xVB^nK?*&OK&sN*?LY-pP?z#`GKms0h)0Qw*di}- zrFQ!qHY>gpKI0`+wxtNC#LtMK7XMh6r_*3L%6E$$7}%m<|Nex`n~NJz$3ik<6o0P6 zkYqKG9OHSOXK*9p)8X}n_Hpl%W##mVIp5Yi{H(FzK1f;&#dsuzr|{J)HGV@Z>KC|8 z$_v7^%Zt=f%>Gw$43NPVJ5Drw<;=;`wH`;*lgxYlJI)sZM$a9nf&-%ybwSP4 zl#T!;h%BawoGuth@A9pl*6Z!sH0@iAV7sjow(x(o&{}L}Zz1hl%Ewp4^qnYnO^$K9 zSRf`H3QC}+JOMP-U{_bLOnju_a#^T&#<9!Jcz-zyn*^`Z=39od&9syc>bWS1bW3uO zNIDAqxqF%01uFE(fE^4yHyhFTr{dW0a>$X{6QOzG-yqBgrSVAT&n8M2b#9x&(FW^m z#;#0awJJ;!S!@CSftYr`)K_`Fo@^_z#@AzJu+g7v%3It6Zh;mf=(@qswEB14Epa5} z^JwG`<;`aFP~YCI63if;uM$1j z>(-fB4H7c{Mo)Hh$M(!7M1|<%AfbYoKiK!!w;y-5kMeFI-w;f}4e82a_=%x26GEuO znm<=!qRHD1GxxmB;z3*J#H^O}c-H*^J#iPtEq(7xg%oeqIxY(HtYSZI3!?i2HbL?aOV+vBIS}4L1Z^x5~HxWw4XXQF0|0GN$tt=04ANmL8a_>DKrSlezn;V*U(t} z$dKdX)G(^&-}x8iA}`ncEXgj>gd}Mh7$>1IbjYs*TJsU*Th?q)IpjBAbWTBd5U3EV z8!3yY^;W*em$~h4m*>`)#JdQuB4y$ZF(6VJ2-84BMkJ%7(LGFCkT%XRDq{0zo{B}a z0kivH1&f7D8FpAt)kVlo%=Vtq-=-E?_l*1L=SxnY)%1`=l+?|-AoR=ZywzLUL> z{^aw>hlZR^ZWJkY1X>d5vWeqkjc6x>mN&Yvi)|7Y$0QN*{+<=V4E6#&S!Fv6Rj&zR z7(K-Cojd77+REx^xqY(5wZx&m=YqhF>>3Z7Gk8ak=j6rtsMRQcZk6 z49HFSJkEj@W}Rv=&x!ZnBELBIg^sD0tE-;;A30NPt|p-ET>rn-La9~5esXKFBBJY{ zorwOQ=d&7{E)#}(ToB^O`X1-4Ei%=1^>dp#&p==1n8*sl z5H&H$&EG>QG-?;o5TkPqQ26lRLPNG#M%cmqxg-)E9zs7l8VUd4kny+qfc~^B?i)OX ziFk#lo=m%GhW(;Ql^7nPJX(+@=LUISgO6l0N=;uFtbH-J*cEY z(D{NDF6J+!>;3xaqkwRL1ChHC&6IWA>I>Xqs(H1rELx<1Gb>!;)54R?mBjdfjD7Qm zv;wZwzo}cb#9Ng_ZTq3I6FPOhA0YI8FO)>G5wQwt8NO(2h~)xk8yo4FUAsOO;G-k( zz+(kU)$}e!{S5>=BO}Cb1w)uXIGui!ekpua2K9{c=j(GxM6+FgvFA1ILg z7T;`ZU9YXT{yw?qs)pFG^S;rHt!8Z#e>~W$)jg**hl^{HMcOR(OnpzvB?2!Gr_XV2 zOgLI*c>Yo5Wd}T{phIOwfynX=zfC&3Gs<|)Jo zCT)#l6?oMsHF5Z3zgGWG`$Yg6U7YC;V+SE+TxCRJ!-mBq?*W$Q$9|YiyF*~9k#7eA zD;u^MyHPy9`Kb>C>W7`mVN{us8)sg&tM5~w<%NnDx#Yd7D3M@)^=i0Shg)|0XMv5| z_tl*tKQWTS&K+c$Tgpf(DpKvJ>rF1?ZQ_wT}Us zs9X@2TJ2!W11p(7-{$8wn>B^(zi<82#!K}(V z$$GNoXP_iRn;mow;zpjIp^bFS-()L^zs~BVf+#HRs-XX{=Dcc8K| zg>7bu0F}O=(_O{^ps@;~jp9EJZMloK}R&A@d*w%5p3A0UO**FezRw4Z`IP z7GjANkyN0Vztfz93#vtfphR7<@UmCZvv}?4w?2vZ(hXF*dD)f%GLQM^eomrzyG?y? zlTgFI!mHNJuOU{%i%%cUk}{0RiC&!TK;>T zXJuWS{hZ5|Q5jHb%t=M02i%iyhh_smd*exaQsZIEP7cTnjxqbSB8(EoSQAlOZ6I8m zqhCvVqi}0I8e+fT(_HpIOy+^XrQ zis{9=x?zCz2`C*H>1%3al$K#>tF^jli>&@6?9&4v(diF1m4)!Tk60yKxV6>%B?BRp z{s^gER0xLpD*o&4eybo!4TFR9pTwV=Scz$di`&b-r`7lf`)vB z_jFP)HOea@T0CqSv)I#Cn+CeG#}^?m-Q992yPCBv1cM56D$?PSZA>VBSIbo3$6Unl zB(ARGp%y|Bb0<^B*kSZVN<%)VV)Pe+rq~9#rj+zbB$qs~H<_)sYRGAY#ilsLAjs08Y>d1vaRgmfGpZ%3f_PNqI@p`CW)JE_Sdj*Sps`_vEflm zd8qZmU(y$;QUv`Setbj1Pv>@@?z4ydTDr~enUB-(9Q7WAR^XLNcYQ&0$C-|FjlfzX zdaY!ihR?3%D`?vrJJf?YIk0_DanGWpX|T9Ef^IiUb-H9eh`5|^S0qe>@mzW{;-Sb> zNZ#f(CPEadA|&3=bp3TQ&39@H-S~%I3usc(AJ}NWP@$Z%TbynVclGqJ$GU*rQ+s

2^H87BpJA;esiy6H+rTkAT6x!w6^xy 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 literal 23706 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 KYhG;X7X3deCV-*< From b3a3d34aa16d95df658706667e7ee10568cde5d9 Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:13:43 +0800 Subject: [PATCH 40/44] Add @CindyMini as a contributor --- .all-contributorsrc | 9 +++++++++ README.md | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6afc348b..d08954ac 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -283,6 +283,15 @@ "contributions": [ "code" ] + }, + { + "login": "CindyMini", + "name": "CICI Chan", + "avatar_url": "https://avatars.githubusercontent.com/u/16411182?v=4", + "profile": "https://github.com/CindyMini", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 8 diff --git a/README.md b/README.md index 00769fda..948867c6 100644 --- a/README.md +++ b/README.md @@ -380,7 +380,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sunlight Xie

💻
lhdycxgghb

💻
Prome

💻 -
zmtzawqlp

💻 +
woshixiaohuhu

💻
woshixiaohuhu

💻 @@ -389,6 +389,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
JOYINF1189

💻
Blues9527

💻
miserydx

💻 +
CICI Chan

💻 From 978b44aa76f5692a694b79d008645d56d657f6dd Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:14:53 +0800 Subject: [PATCH 41/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README-zh.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README-zh.md b/README-zh.md index d4e0ffed..6a08f07f 100644 --- a/README-zh.md +++ b/README-zh.md @@ -389,6 +389,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
JOYINF1189

💻
Blues9527

💻
miserydx

💻 +
CICI Chan

💻 From c1ecddeeb99d3579b69eb623ab0fa233c312132e Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Fri, 22 Dec 2023 14:33:12 +0800 Subject: [PATCH 42/44] add contributors --- README-zh.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README-zh.md b/README-zh.md index 6a08f07f..77432344 100644 --- a/README-zh.md +++ b/README-zh.md @@ -380,7 +380,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sunlight Xie

💻
lhdycxgghb

💻
Prome

💻 -
zmtzawqlp

💻 +
zmtzawqlp

💻
woshixiaohuhu

💻 diff --git a/README.md b/README.md index 948867c6..5917f5c1 100644 --- a/README.md +++ b/README.md @@ -380,7 +380,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Sunlight Xie

💻
lhdycxgghb

💻
Prome

💻 -
woshixiaohuhu

💻 +
zmtzawqlp

💻
woshixiaohuhu

💻 From 625ea551037534249993889c41c93f6585039b8c Mon Sep 17 00:00:00 2001 From: yangjiayi Date: Wed, 3 Jan 2024 19:56:31 +0800 Subject: [PATCH 43/44] =?UTF-8?q?1.FairCommonPlugin=E4=BE=8B=E5=AD=90=202.?= =?UTF-8?q?fair=5Fextension=E6=96=87=E6=A1=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...est_flutter_ui_component_home_list.fair.js | 2 +- ...t_flutter_ui_component_home_list.fair.json | 3 +- ...utter_ui_component_home_list.fair.metadata | 7 +- ...component_hotel_listview_content.fair.json | 3 +- ...onent_hotel_listview_content.fair.metadata | 7 +- ...ib_best_flutter_ui_feedback_screen.fair.js | 2 +- ..._best_flutter_ui_feedback_screen.fair.json | 3 +- ...t_flutter_ui_feedback_screen.fair.metadata | 7 +- .../lib_best_flutter_ui_help_screen.fair.json | 3 +- ..._best_flutter_ui_help_screen.fair.metadata | 7 +- ..._flutter_ui_invite_friend_screen.fair.json | 3 +- ...tter_ui_invite_friend_screen.fair.metadata | 7 +- ...fair_widget_fair_delegate_widget.fair.json | 3 +- ..._widget_fair_delegate_widget.fair.metadata | 7 +- ...lib_fair_widget_fair_plugin_widget.fair.js | 2 +- ...b_fair_widget_fair_plugin_widget.fair.json | 54 +++++++++---- ...ir_widget_fair_plugin_widget.fair.metadata | 7 +- ...ib_fair_widget_fair_props_widget.fair.json | 3 +- ...air_widget_fair_props_widget.fair.metadata | 7 +- ..._fairbinding_fair_binding_sample.fair.json | 3 +- ...rbinding_fair_binding_sample.fair.metadata | 7 +- .../fair/lib_json_file_explain.fair.json | 3 +- .../fair/lib_json_file_explain.fair.metadata | 7 +- example/assets/fair/lib_main.fair.js | 2 +- example/assets/fair/lib_main.fair.json | 3 +- example/assets/fair/lib_main.fair.metadata | 7 +- .../fair/lib_page2page_page_one.fair.json | 3 +- .../fair/lib_page2page_page_one.fair.metadata | 7 +- .../fair/lib_page2page_page_two.fair.json | 3 +- .../fair/lib_page2page_page_two.fair.metadata | 7 +- ..._template_appbar_appbar_template.fair.json | 3 +- ...plate_appbar_appbar_template.fair.metadata | 7 +- ...template_detail_page_fair_detail.fair.json | 3 +- ...late_detail_page_fair_detail.fair.metadata | 7 +- ..._template_drawer_drawer_template.fair.json | 3 +- ...plate_drawer_drawer_template.fair.metadata | 7 +- .../lib_template_fab_fab_template.fair.json | 3 +- ...ib_template_fab_fab_template.fair.metadata | 7 +- ...plate_gridview_gridview_template.fair.json | 3 +- ...e_gridview_gridview_template.fair.metadata | 7 +- ...listview_hotel_listview_template.fair.json | 3 +- ...view_hotel_listview_template.fair.metadata | 7 +- ..._template_list_card_moments_list.fair.json | 3 +- ...plate_list_card_moments_list.fair.metadata | 7 +- ...lib_template_list_page_list_page.fair.json | 3 +- ...template_list_page_list_page.fair.metadata | 7 +- ...e_login_page_login_page_template.fair.json | 3 +- ...gin_page_login_page_template.fair.metadata | 7 +- ...plate_pageview_pageview_template.fair.json | 3 +- ...e_pageview_pageview_template.fair.metadata | 7 +- ...plate_scrollview_home_scrollview.fair.json | 3 +- ...e_scrollview_home_scrollview.fair.metadata | 7 +- ...ered_view_staggeredview_template.fair.json | 3 +- ..._view_staggeredview_template.fair.metadata | 7 +- ...template_tabbar_page_tabbar_page.fair.json | 3 +- ...late_tabbar_page_tabbar_page.fair.metadata | 7 +- example/assets/fair_basic_config.json | 1 + example/assets/plugin/fair_common_plugin.js | 10 +++ .../lib/fair_widget/fair_plugin_widget.dart | 47 ++++++++--- .../plugin/fair_common_plugin.dart | 19 +++++ .../fair_widget/plugin/fair_http_plugin.dart | 52 +++++++++++++ example/lib/main.dart | 9 ++- fair/assets/fair_core/fair_common_plugin.js | 2 +- fair_extension/README.md | 77 ++++++++++--------- 64 files changed, 337 insertions(+), 199 deletions(-) create mode 100644 example/assets/plugin/fair_common_plugin.js create mode 100644 example/lib/fair_widget/plugin/fair_common_plugin.dart create mode 100644 example/lib/fair_widget/plugin/fair_http_plugin.dart diff --git a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.js b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.js index 1508cfe4..0af02c45 100644 --- a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.js +++ b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;defineModule(1,function(__mod__){with(__mod__.imports){function AppTheme(){const inner=AppTheme.__inner__;if(this==__global__){return new AppTheme({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);AppTheme.prototype.ctor.apply(this,args);return this;}}AppTheme.__inner__=function inner(){};AppTheme.prototype={};AppTheme.prototype.ctor=function(){};AppTheme._=function ctor(){const __thiz__=Object.create(AppTheme.prototype);AppTheme.__inner__.call(__thiz__);with(__thiz__){(function(){}).call(__thiz__);}return __thiz__;};AppTheme.notWhite=(function(){with(AppTheme){return Color(0xFFEDF0F2);}})();AppTheme.nearlyWhite=(function(){with(AppTheme){return Color(0xFFFEFEFE);}})();AppTheme.white=(function(){with(AppTheme){return Color(0xFFFFFFFF);}})();AppTheme.nearlyBlack=(function(){with(AppTheme){return Color(0xFF213333);}})();AppTheme.grey=(function(){with(AppTheme){return Color(0xFF3A5160);}})();AppTheme.dark_grey=(function(){with(AppTheme){return Color(0xFF313A44);}})();AppTheme.darkText=(function(){with(AppTheme){return Color(0xFF253840);}})();AppTheme.darkerText=(function(){with(AppTheme){return Color(0xFF17262A);}})();AppTheme.lightText=(function(){with(AppTheme){return Color(0xFF4A6572);}})();AppTheme.deactivatedText=(function(){with(AppTheme){return Color(0xFF767676);}})();AppTheme.dismissibleBackground=(function(){with(AppTheme){return Color(0xFF364A54);}})();AppTheme.chipBackground=(function(){with(AppTheme){return Color(0xFFEEF1F3);}})();AppTheme.spacer=(function(){with(AppTheme){return Color(0xFFF2F2F2);}})();AppTheme.fontName=(function(){with(AppTheme){return'WorkSans';}})();AppTheme.textTheme=(function(){with(AppTheme){return TextTheme({headline4:display1,headline5:headline,headline6:title,subtitle2:subtitle,bodyText2:body2,bodyText1:body1,caption:caption});}})();AppTheme.display1=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:36,letterSpacing:0.4,height:0.9,color:darkerText});}})();AppTheme.headline=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:24,letterSpacing:0.27,color:darkerText});}})();AppTheme.title=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:16,letterSpacing:0.18,color:darkerText});}})();AppTheme.subtitle=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:14,letterSpacing:-0.04,color:darkText});}})();AppTheme.body2=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:14,letterSpacing:0.2,color:darkText});}})();AppTheme.body1=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:16,letterSpacing:-0.05,color:darkText});}})();AppTheme.caption=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:12,letterSpacing:0.2,color:lightText});}})();AppTheme.greyWithOpacity=(function(){with(AppTheme){return Colors.grey.withOpacity(0.8);}})();}__mod__.exports.AppTheme=AppTheme;},[]);return runCallback(function(__mod__){with(__mod__.imports){function HomeListView(){const inner=HomeListView.__inner__;if(this==__global__){return new HomeListView({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);HomeListView.prototype.ctor.apply(this,args);return this;}}HomeListView.__inner__=function inner(){this.imagePath=null;this.callBack=null;};HomeListView.prototype={};HomeListView.prototype.ctor=function(){};;return HomeListView();}},[1]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function HomeListView(){const inner=HomeListView.__inner__;if(this==__global__){return new HomeListView({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);HomeListView.prototype.ctor.apply(this,args);return this;}}HomeListView.__inner__=function inner(){this.imagePath=null;this.callBack=null;};HomeListView.prototype={};HomeListView.prototype.ctor=function(){};;return HomeListView();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.json b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.json index 554aedda..1fc7b9bf 100644 --- a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.json +++ b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.json @@ -60,6 +60,5 @@ } } }, - "methodMap": {}, - "digest": "f8e618a1c8d026e7cb779d0527b55702" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.metadata b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.metadata index bbbe877b..1de4c4ee 100644 --- a/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.metadata +++ b/example/assets/fair/lib_best_flutter_ui_component_home_list.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.055437. +# Generated by Fair on 2024-01-03 19:50:39.339174. source: example|lib/best_flutter_ui/component/home_list.dart -md5: df2fb754edb75b2b64559cc1ef963e14 +md5: 1f763bd5997d742302ba8ce22cf595c9 json: example|build/fair/lib_best_flutter_ui_component_home_list.fair.json -date: 2023-10-31 10:53:29.055482 +bin: example|build/fair/lib_best_flutter_ui_component_home_list.fair.bin +date: 2024-01-03 19:50:39.339328 diff --git a/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.json b/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.json index e30ccfbd..ce9e997a 100644 --- a/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.json +++ b/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.json @@ -368,6 +368,5 @@ } } }, - "methodMap": {}, - "digest": "c71e611d0ea685885f67596691287e96" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.metadata b/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.metadata index 79711c30..94dc78b5 100644 --- a/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.metadata +++ b/example/assets/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.040904. +# Generated by Fair on 2024-01-03 19:50:38.807430. source: example|lib/best_flutter_ui/component/hotel_listview_content.dart -md5: b36b1cbe9f5ec06c6ef6132c34dc409f +md5: 9b5da932afbdaf3c17fa023200716315 json: example|build/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.json -date: 2023-10-31 10:53:29.041067 +bin: example|build/fair/lib_best_flutter_ui_component_hotel_listview_content.fair.bin +date: 2024-01-03 19:50:38.807718 diff --git a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.js b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.js index 1e0ba581..54c5b6e8 100644 --- a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.js +++ b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;defineModule(3,function(__mod__){with(__mod__.imports){function AppTheme(){const inner=AppTheme.__inner__;if(this==__global__){return new AppTheme({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);AppTheme.prototype.ctor.apply(this,args);return this;}}AppTheme.__inner__=function inner(){};AppTheme.prototype={};AppTheme.prototype.ctor=function(){};AppTheme._=function ctor(){const __thiz__=Object.create(AppTheme.prototype);AppTheme.__inner__.call(__thiz__);with(__thiz__){(function(){}).call(__thiz__);}return __thiz__;};AppTheme.notWhite=(function(){with(AppTheme){return Color(0xFFEDF0F2);}})();AppTheme.nearlyWhite=(function(){with(AppTheme){return Color(0xFFFEFEFE);}})();AppTheme.white=(function(){with(AppTheme){return Color(0xFFFFFFFF);}})();AppTheme.nearlyBlack=(function(){with(AppTheme){return Color(0xFF213333);}})();AppTheme.grey=(function(){with(AppTheme){return Color(0xFF3A5160);}})();AppTheme.dark_grey=(function(){with(AppTheme){return Color(0xFF313A44);}})();AppTheme.darkText=(function(){with(AppTheme){return Color(0xFF253840);}})();AppTheme.darkerText=(function(){with(AppTheme){return Color(0xFF17262A);}})();AppTheme.lightText=(function(){with(AppTheme){return Color(0xFF4A6572);}})();AppTheme.deactivatedText=(function(){with(AppTheme){return Color(0xFF767676);}})();AppTheme.dismissibleBackground=(function(){with(AppTheme){return Color(0xFF364A54);}})();AppTheme.chipBackground=(function(){with(AppTheme){return Color(0xFFEEF1F3);}})();AppTheme.spacer=(function(){with(AppTheme){return Color(0xFFF2F2F2);}})();AppTheme.fontName=(function(){with(AppTheme){return'WorkSans';}})();AppTheme.textTheme=(function(){with(AppTheme){return TextTheme({headline4:display1,headline5:headline,headline6:title,subtitle2:subtitle,bodyText2:body2,bodyText1:body1,caption:caption});}})();AppTheme.display1=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:36,letterSpacing:0.4,height:0.9,color:darkerText});}})();AppTheme.headline=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:24,letterSpacing:0.27,color:darkerText});}})();AppTheme.title=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.bold,fontSize:16,letterSpacing:0.18,color:darkerText});}})();AppTheme.subtitle=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:14,letterSpacing:-0.04,color:darkText});}})();AppTheme.body2=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:14,letterSpacing:0.2,color:darkText});}})();AppTheme.body1=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:16,letterSpacing:-0.05,color:darkText});}})();AppTheme.caption=(function(){with(AppTheme){return TextStyle({fontFamily:fontName,fontWeight:FontWeight.w400,fontSize:12,letterSpacing:0.2,color:lightText});}})();AppTheme.greyWithOpacity=(function(){with(AppTheme){return Colors.grey.withOpacity(0.8);}})();}__mod__.exports.AppTheme=AppTheme;},[]);defineModule(1,function(__mod__){with(__mod__.imports){function ComposerWidget(){const inner=ComposerWidget.__inner__;if(this==__global__){return new ComposerWidget({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);ComposerWidget.prototype.ctor.apply(this,args);return this;}}ComposerWidget.__inner__=function inner(){StatelessWidget.__inner__.call(this);};ComposerWidget.prototype={};ComposerWidget.prototype.ctor=function(){StatelessWidget.prototype.ctor.call(this)};inherit(ComposerWidget,StatelessWidget);}__mod__.exports.ComposerWidget=ComposerWidget;},[3]);defineModule(2,function(__mod__){with(__mod__.imports){function FairState1(){const inner=FairState1.__inner__;if(this==__global__){return new FairState1({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);FairState1.prototype.ctor.apply(this,args);return this;}}FairState1.__inner__=function inner(){State.__inner__.call(this);};FairState1.prototype={};FairState1.prototype.ctor=function(){State.prototype.ctor.call(this)};inherit(FairState1,State);}__mod__.exports.FairState1=FairState1;},[]);return runCallback(function(__mod__){with(__mod__.imports){function _FeedbackScreenState(){const inner=_FeedbackScreenState.__inner__;if(this==__global__){return new _FeedbackScreenState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_FeedbackScreenState.prototype.ctor.apply(this,args);return this;}}_FeedbackScreenState.__inner__=function inner(){};_FeedbackScreenState.prototype={};_FeedbackScreenState.prototype.ctor=function(){};;return _FeedbackScreenState();}},[1,2]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;defineModule(1,function(__mod__){with(__mod__.imports){function ComposerWidget(){const inner=ComposerWidget.__inner__;if(this==__global__){return new ComposerWidget({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);ComposerWidget.prototype.ctor.apply(this,args);return this;}}ComposerWidget.__inner__=function inner(){StatelessWidget.__inner__.call(this);};ComposerWidget.prototype={};ComposerWidget.prototype.ctor=function(){StatelessWidget.prototype.ctor.call(this)};inherit(ComposerWidget,StatelessWidget);}__mod__.exports.ComposerWidget=ComposerWidget;},[]);return runCallback(function(__mod__){with(__mod__.imports){function _FeedbackScreenState(){const inner=_FeedbackScreenState.__inner__;if(this==__global__){return new _FeedbackScreenState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_FeedbackScreenState.prototype.ctor.apply(this,args);return this;}}_FeedbackScreenState.__inner__=function inner(){};_FeedbackScreenState.prototype={};_FeedbackScreenState.prototype.ctor=function(){};;return _FeedbackScreenState();}},[1]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.json b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.json index 7d66926b..892d248d 100644 --- a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.json +++ b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.json @@ -221,6 +221,5 @@ } } }, - "methodMap": {}, - "digest": "1993ec6c374b699c43a4d29b6654b853" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.metadata b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.metadata index b5bd09bf..7c74f5fd 100644 --- a/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.metadata +++ b/example/assets/fair/lib_best_flutter_ui_feedback_screen.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.074415. +# Generated by Fair on 2024-01-03 19:50:39.201805. source: example|lib/best_flutter_ui/feedback_screen.dart -md5: 46370672f312947e0bd06e8e4e9d8af3 +md5: 177e27ea81b4826851fdc0838254371e json: example|build/fair/lib_best_flutter_ui_feedback_screen.fair.json -date: 2023-10-31 10:53:29.074526 +bin: example|build/fair/lib_best_flutter_ui_feedback_screen.fair.bin +date: 2024-01-03 19:50:39.202023 diff --git a/example/assets/fair/lib_best_flutter_ui_help_screen.fair.json b/example/assets/fair/lib_best_flutter_ui_help_screen.fair.json index c7ffb654..b5d661b3 100644 --- a/example/assets/fair/lib_best_flutter_ui_help_screen.fair.json +++ b/example/assets/fair/lib_best_flutter_ui_help_screen.fair.json @@ -204,6 +204,5 @@ } } }, - "methodMap": {}, - "digest": "a5302bcd8904f1273241fccba29541a2" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_help_screen.fair.metadata b/example/assets/fair/lib_best_flutter_ui_help_screen.fair.metadata index cccafa79..01648963 100644 --- a/example/assets/fair/lib_best_flutter_ui_help_screen.fair.metadata +++ b/example/assets/fair/lib_best_flutter_ui_help_screen.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.084137. +# Generated by Fair on 2024-01-03 19:50:38.934038. source: example|lib/best_flutter_ui/help_screen.dart -md5: 2f008247e34b9af5b19d04f329c0d746 +md5: 36e4633076d65d05b573dd6a65d5be31 json: example|build/fair/lib_best_flutter_ui_help_screen.fair.json -date: 2023-10-31 10:53:29.084255 +bin: example|build/fair/lib_best_flutter_ui_help_screen.fair.bin +date: 2024-01-03 19:50:38.934257 diff --git a/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.json b/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.json index 086dc162..3440c922 100644 --- a/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.json +++ b/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.json @@ -223,6 +223,5 @@ } } }, - "methodMap": {}, - "digest": "0ad7d3e4f1d1f79c4158b3f0470e9dce" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.metadata b/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.metadata index bb811954..9bc1c173 100644 --- a/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.metadata +++ b/example/assets/fair/lib_best_flutter_ui_invite_friend_screen.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.092573. +# Generated by Fair on 2024-01-03 19:50:38.611640. source: example|lib/best_flutter_ui/invite_friend_screen.dart -md5: b419d1d4bf78fd42bf1b094fa647b680 +md5: 4904771600e5888344da62190bd8aad2 json: example|build/fair/lib_best_flutter_ui_invite_friend_screen.fair.json -date: 2023-10-31 10:53:29.092677 +bin: example|build/fair/lib_best_flutter_ui_invite_friend_screen.fair.bin +date: 2024-01-03 19:50:38.611870 diff --git a/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.json b/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.json index 6834e6cb..34e00723 100644 --- a/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.json +++ b/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.json @@ -24,6 +24,5 @@ "_itemBuilder": { "className": "Container" } - }, - "digest": "738ff06e1e42523795d77960a016b525" + } } \ No newline at end of file diff --git a/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.metadata b/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.metadata index 27255ccf..dd3e4cd1 100644 --- a/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.metadata +++ b/example/assets/fair/lib_fair_widget_fair_delegate_widget.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.985160. +# Generated by Fair on 2024-01-03 19:50:37.880181. source: example|lib/fair_widget/fair_delegate_widget.dart -md5: 4c0d73440d0bd147776fa5184dc3835c +md5: b6dc09d65832729dcbeb54f8c587bf91 json: example|build/fair/lib_fair_widget_fair_delegate_widget.fair.json -date: 2023-10-31 10:53:28.985224 +bin: example|build/fair/lib_fair_widget_fair_delegate_widget.fair.bin +date: 2024-01-03 19:50:37.880357 diff --git a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.js b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.js index d1e8c597..d3b96ffd 100644 --- a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.js +++ b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _FairPluginWidgetState(){const inner=_FairPluginWidgetState.__inner__;if(this==__global__){return new _FairPluginWidgetState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_FairPluginWidgetState.prototype.ctor.apply(this,args);return this;}}_FairPluginWidgetState.__inner__=function inner(){};_FairPluginWidgetState.prototype={callPhone:function callPhone(){const __thiz__=this;with(__thiz__){FairBasicPlugin().call(convertObjectLiteralToSetOrMap({['pageName']:'#FairKey#',['args']:convertObjectLiteralToSetOrMap({['type']:'Call',['phoneNumber']:'15800342502',['response']:function dummy(data){print(`response = ${data}`);},}),}));}},};_FairPluginWidgetState.prototype.ctor=function(){};;return _FairPluginWidgetState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;return runCallback(function(__mod__){with(__mod__.imports){function _FairPluginWidgetState(){const inner=_FairPluginWidgetState.__inner__;if(this==__global__){return new _FairPluginWidgetState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_FairPluginWidgetState.prototype.ctor.apply(this,args);return this;}}_FairPluginWidgetState.__inner__=function inner(){};_FairPluginWidgetState.prototype={callPhone:function callPhone(){const __thiz__=this;with(__thiz__){FairBasicPlugin().call(convertObjectLiteralToSetOrMap({['pageName']:'#FairKey#',['args']:convertObjectLiteralToSetOrMap({['type']:'Call',['phoneNumber']:'15800342502',['response']:function dummy(data){print(`response = ${data}`);},}),}));}},commonHttp:function commonHttp(){const __thiz__=this;with(__thiz__){FairCommonPlugin().http(convertObjectLiteralToSetOrMap({['method']:'GET',['url']:'https://wos2.58cdn.com.cn/DeFazYxWvDti/frsupload/3b8ae7a4e0884b4d75b8094f6c83cd8c_list_page_data.json',['callback']:function dummy(result){if(result!=null){let statusCode=result.__op_idx__('statusCode');if(statusCode==200){let list=result.__op_idx__('data').__op_idx__('data');list.forEach(function dummy(item){let icon=item.__op_idx__('icon');print(`icon = ${icon}`);});}}},}));}},};_FairPluginWidgetState.prototype.ctor=function(){};;return _FairPluginWidgetState();}},[]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.json b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.json index a4af1521..ded9d5dc 100644 --- a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.json +++ b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.json @@ -19,23 +19,46 @@ "className": "Center", "na": { "child": { - "className": "GestureDetector", + "className": "Column", "na": { - "onTap": "@(callPhone)", - "child": { - "className": "Container", - "na": { - "height": 50, - "width": 100, - "alignment": "#(Alignment.center)", - "child": { - "className": "Text", - "pa": [ - "拨打电话" - ] + "children": [ + { + "className": "Container", + "na": { + "alignment": "#(Alignment.center)", + "child": { + "className": "ElevatedButton", + "na": { + "onPressed": "@(callPhone)", + "child": { + "className": "Text", + "pa": [ + "拨打电话-基于FairBasicPlugin" + ] + } + } + } + } + }, + { + "className": "Container", + "na": { + "alignment": "#(Alignment.center)", + "child": { + "className": "ElevatedButton", + "na": { + "onPressed": "@(commonHttp)", + "child": { + "className": "Text", + "pa": [ + "网络请求-基于FairCommonPlugin" + ] + } + } + } } } - } + ] } } } @@ -43,6 +66,5 @@ } } }, - "methodMap": {}, - "digest": "3603040f2e2cb2d8ae3c200b08e85062" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.metadata b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.metadata index 6fc4df91..08da0984 100644 --- a/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.metadata +++ b/example/assets/fair/lib_fair_widget_fair_plugin_widget.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.100833. +# Generated by Fair on 2024-01-03 19:50:38.348516. source: example|lib/fair_widget/fair_plugin_widget.dart -md5: cffd851be6c426bf983fb077075fad19 +md5: 13a6d088266e66097bd88142ccc62170 json: example|build/fair/lib_fair_widget_fair_plugin_widget.fair.json -date: 2023-10-31 10:53:29.100916 +bin: example|build/fair/lib_fair_widget_fair_plugin_widget.fair.bin +date: 2024-01-03 19:50:38.348662 diff --git a/example/assets/fair/lib_fair_widget_fair_props_widget.fair.json b/example/assets/fair/lib_fair_widget_fair_props_widget.fair.json index 131ceb4d..eea042f5 100644 --- a/example/assets/fair/lib_fair_widget_fair_props_widget.fair.json +++ b/example/assets/fair/lib_fair_widget_fair_props_widget.fair.json @@ -31,6 +31,5 @@ } } }, - "methodMap": {}, - "digest": "63f30c5614414d8cd9e315a8bbb3de67" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_fair_widget_fair_props_widget.fair.metadata b/example/assets/fair/lib_fair_widget_fair_props_widget.fair.metadata index bcb96a0c..308786a3 100644 --- a/example/assets/fair/lib_fair_widget_fair_props_widget.fair.metadata +++ b/example/assets/fair/lib_fair_widget_fair_props_widget.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.996912. +# Generated by Fair on 2024-01-03 19:50:37.828850. source: example|lib/fair_widget/fair_props_widget.dart -md5: f609a09df143913f51e3547f9bd3fa4e +md5: 2826f90df6725f256080c8421c2d2d6a json: example|build/fair/lib_fair_widget_fair_props_widget.fair.json -date: 2023-10-31 10:53:28.996953 +bin: example|build/fair/lib_fair_widget_fair_props_widget.fair.bin +date: 2024-01-03 19:50:37.829100 diff --git a/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.json b/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.json index 445d22d0..3fecfaff 100644 --- a/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.json +++ b/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.json @@ -35,6 +35,5 @@ } } }, - "methodMap": {}, - "digest": "19acbe84f2fc9b1af2a72025d735b39a" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.metadata b/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.metadata index 63516a23..5d473433 100644 --- a/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.metadata +++ b/example/assets/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.991746. +# Generated by Fair on 2024-01-03 19:50:39.258672. source: example|lib/fair_widget/fairbinding/fair_binding_sample.dart -md5: 50d35e75a6ba9e417199781df8f93a3d +md5: c75fe0eec710da949fbb394cfa68824d json: example|build/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.json -date: 2023-10-31 10:53:28.991789 +bin: example|build/fair/lib_fair_widget_fairbinding_fair_binding_sample.fair.bin +date: 2024-01-03 19:50:39.258840 diff --git a/example/assets/fair/lib_json_file_explain.fair.json b/example/assets/fair/lib_json_file_explain.fair.json index 6c6780a6..2ffc79bb 100644 --- a/example/assets/fair/lib_json_file_explain.fair.json +++ b/example/assets/fair/lib_json_file_explain.fair.json @@ -68,6 +68,5 @@ "title" ] } - }, - "digest": "a2d5ea46d61a63f63c9cc7d256d6c9dd" + } } \ No newline at end of file diff --git a/example/assets/fair/lib_json_file_explain.fair.metadata b/example/assets/fair/lib_json_file_explain.fair.metadata index f62aa7be..bb2b7633 100644 --- a/example/assets/fair/lib_json_file_explain.fair.metadata +++ b/example/assets/fair/lib_json_file_explain.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.969805. +# Generated by Fair on 2024-01-03 19:50:37.987829. source: example|lib/json_file_explain.dart -md5: fd39c25e84402b622ba0dc2d174272fe +md5: ba280911c77bc4f2b70c10d031f8ceaa json: example|build/fair/lib_json_file_explain.fair.json -date: 2023-10-31 10:53:28.969874 +bin: example|build/fair/lib_json_file_explain.fair.bin +date: 2024-01-03 19:50:37.988039 diff --git a/example/assets/fair/lib_main.fair.js b/example/assets/fair/lib_main.fair.js index 5a118072..de8582fb 100644 --- a/example/assets/fair/lib_main.fair.js +++ b/example/assets/fair/lib_main.fair.js @@ -1 +1 @@ -GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;defineModule(2,function(__mod__){with(__mod__.imports){function AppGeneratedModule(){const inner=AppGeneratedModule.__inner__;if(this==__global__){return new AppGeneratedModule({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);AppGeneratedModule.prototype.ctor.apply(this,args);return this;}}AppGeneratedModule.__inner__=function inner(){GeneratedModule.__inner__.call(this);};AppGeneratedModule.prototype={components:function components(){const __thiz__=this;with(__thiz__){return convertObjectLiteralToSetOrMap({['FontAwesomeIcons']:convertObjectLiteralToSetOrMap({['zero']:FontAwesomeIcons.zero,['one']:FontAwesomeIcons.one,['two']:FontAwesomeIcons.two,['three']:FontAwesomeIcons.three,['four']:FontAwesomeIcons.four,['five']:FontAwesomeIcons.five,['six']:FontAwesomeIcons.six,['seven']:FontAwesomeIcons.seven,['eight']:FontAwesomeIcons.eight,['nine']:FontAwesomeIcons.nine,['fortyTwoGroup']:FontAwesomeIcons.fortyTwoGroup,['fiveHundredPx']:FontAwesomeIcons.fiveHundredPx,['a']:FontAwesomeIcons.a,['accessibleIcon']:FontAwesomeIcons.accessibleIcon,['accusoft']:FontAwesomeIcons.accusoft,['solidAddressBook']:FontAwesomeIcons.solidAddressBook,['addressBook']:FontAwesomeIcons.addressBook,['solidAddressCard']:FontAwesomeIcons.solidAddressCard,['addressCard']:FontAwesomeIcons.addressCard,['adn']:FontAwesomeIcons.adn,['adversal']:FontAwesomeIcons.adversal,['affiliatetheme']:FontAwesomeIcons.affiliatetheme,['airbnb']:FontAwesomeIcons.airbnb,['algolia']:FontAwesomeIcons.algolia,['alignCenter']:FontAwesomeIcons.alignCenter,['alignJustify']:FontAwesomeIcons.alignJustify,['alignLeft']:FontAwesomeIcons.alignLeft,['alignRight']:FontAwesomeIcons.alignRight,['alipay']:FontAwesomeIcons.alipay,['amazon']:FontAwesomeIcons.amazon,['amazonPay']:FontAwesomeIcons.amazonPay,['amilia']:FontAwesomeIcons.amilia,['anchor']:FontAwesomeIcons.anchor,['anchorCircleCheck']:FontAwesomeIcons.anchorCircleCheck,['anchorCircleExclamation']:FontAwesomeIcons.anchorCircleExclamation,['anchorCircleXmark']:FontAwesomeIcons.anchorCircleXmark,['anchorLock']:FontAwesomeIcons.anchorLock,['android']:FontAwesomeIcons.android,['angellist']:FontAwesomeIcons.angellist,['angleDown']:FontAwesomeIcons.angleDown,['angleLeft']:FontAwesomeIcons.angleLeft,['angleRight']:FontAwesomeIcons.angleRight,['angleUp']:FontAwesomeIcons.angleUp,['anglesDown']:FontAwesomeIcons.anglesDown,['anglesLeft']:FontAwesomeIcons.anglesLeft,['anglesRight']:FontAwesomeIcons.anglesRight,['anglesUp']:FontAwesomeIcons.anglesUp,['angrycreative']:FontAwesomeIcons.angrycreative,['angular']:FontAwesomeIcons.angular,['ankh']:FontAwesomeIcons.ankh,['appStore']:FontAwesomeIcons.appStore,['appStoreIos']:FontAwesomeIcons.appStoreIos,['apper']:FontAwesomeIcons.apper,['apple']:FontAwesomeIcons.apple,['applePay']:FontAwesomeIcons.applePay,['appleWhole']:FontAwesomeIcons.appleWhole,['archway']:FontAwesomeIcons.archway,['arrowDown']:FontAwesomeIcons.arrowDown,['arrowDown19']:FontAwesomeIcons.arrowDown19,['arrowDown91']:FontAwesomeIcons.arrowDown91,['arrowDownAZ']:FontAwesomeIcons.arrowDownAZ,['arrowDownLong']:FontAwesomeIcons.arrowDownLong,['arrowDownShortWide']:FontAwesomeIcons.arrowDownShortWide,['arrowDownUpAcrossLine']:FontAwesomeIcons.arrowDownUpAcrossLine,['arrowDownUpLock']:FontAwesomeIcons.arrowDownUpLock,['arrowDownWideShort']:FontAwesomeIcons.arrowDownWideShort,['arrowDownZA']:FontAwesomeIcons.arrowDownZA,['arrowLeft']:FontAwesomeIcons.arrowLeft,['arrowLeftLong']:FontAwesomeIcons.arrowLeftLong,['arrowPointer']:FontAwesomeIcons.arrowPointer,['arrowRight']:FontAwesomeIcons.arrowRight,['arrowRightArrowLeft']:FontAwesomeIcons.arrowRightArrowLeft,['arrowRightFromBracket']:FontAwesomeIcons.arrowRightFromBracket,['arrowRightLong']:FontAwesomeIcons.arrowRightLong,['arrowRightToBracket']:FontAwesomeIcons.arrowRightToBracket,['arrowRightToCity']:FontAwesomeIcons.arrowRightToCity,['arrowRotateLeft']:FontAwesomeIcons.arrowRotateLeft,['arrowRotateRight']:FontAwesomeIcons.arrowRotateRight,['arrowTrendDown']:FontAwesomeIcons.arrowTrendDown,['arrowTrendUp']:FontAwesomeIcons.arrowTrendUp,['arrowTurnDown']:FontAwesomeIcons.arrowTurnDown,['arrowTurnUp']:FontAwesomeIcons.arrowTurnUp,['arrowUp']:FontAwesomeIcons.arrowUp,['arrowUp19']:FontAwesomeIcons.arrowUp19,['arrowUp91']:FontAwesomeIcons.arrowUp91,['arrowUpAZ']:FontAwesomeIcons.arrowUpAZ,['arrowUpFromBracket']:FontAwesomeIcons.arrowUpFromBracket,['arrowUpFromGroundWater']:FontAwesomeIcons.arrowUpFromGroundWater,['arrowUpFromWaterPump']:FontAwesomeIcons.arrowUpFromWaterPump,['arrowUpLong']:FontAwesomeIcons.arrowUpLong,['arrowUpRightDots']:FontAwesomeIcons.arrowUpRightDots,['arrowUpRightFromSquare']:FontAwesomeIcons.arrowUpRightFromSquare,['arrowUpShortWide']:FontAwesomeIcons.arrowUpShortWide,['arrowUpWideShort']:FontAwesomeIcons.arrowUpWideShort,['arrowUpZA']:FontAwesomeIcons.arrowUpZA,['arrowsDownToLine']:FontAwesomeIcons.arrowsDownToLine,['arrowsDownToPeople']:FontAwesomeIcons.arrowsDownToPeople,['arrowsLeftRight']:FontAwesomeIcons.arrowsLeftRight,['arrowsLeftRightToLine']:FontAwesomeIcons.arrowsLeftRightToLine,['arrowsRotate']:FontAwesomeIcons.arrowsRotate,['arrowsSpin']:FontAwesomeIcons.arrowsSpin,['arrowsSplitUpAndLeft']:FontAwesomeIcons.arrowsSplitUpAndLeft,['arrowsToCircle']:FontAwesomeIcons.arrowsToCircle,['arrowsToDot']:FontAwesomeIcons.arrowsToDot,['arrowsToEye']:FontAwesomeIcons.arrowsToEye,['arrowsTurnRight']:FontAwesomeIcons.arrowsTurnRight,['arrowsTurnToDots']:FontAwesomeIcons.arrowsTurnToDots,['arrowsUpDown']:FontAwesomeIcons.arrowsUpDown,['arrowsUpDownLeftRight']:FontAwesomeIcons.arrowsUpDownLeftRight,['arrowsUpToLine']:FontAwesomeIcons.arrowsUpToLine,['artstation']:FontAwesomeIcons.artstation,['asterisk']:FontAwesomeIcons.asterisk,['asymmetrik']:FontAwesomeIcons.asymmetrik,['at']:FontAwesomeIcons.at,['atlassian']:FontAwesomeIcons.atlassian,['atom']:FontAwesomeIcons.atom,['audible']:FontAwesomeIcons.audible,['audioDescription']:FontAwesomeIcons.audioDescription,['australSign']:FontAwesomeIcons.australSign,['autoprefixer']:FontAwesomeIcons.autoprefixer,['avianex']:FontAwesomeIcons.avianex,['aviato']:FontAwesomeIcons.aviato,['award']:FontAwesomeIcons.award,['aws']:FontAwesomeIcons.aws,['b']:FontAwesomeIcons.b,['baby']:FontAwesomeIcons.baby,['babyCarriage']:FontAwesomeIcons.babyCarriage,['backward']:FontAwesomeIcons.backward,['backwardFast']:FontAwesomeIcons.backwardFast,['backwardStep']:FontAwesomeIcons.backwardStep,['bacon']:FontAwesomeIcons.bacon,['bacteria']:FontAwesomeIcons.bacteria,['bacterium']:FontAwesomeIcons.bacterium,['bagShopping']:FontAwesomeIcons.bagShopping,['bahai']:FontAwesomeIcons.bahai,['bahtSign']:FontAwesomeIcons.bahtSign,['ban']:FontAwesomeIcons.ban,['banSmoking']:FontAwesomeIcons.banSmoking,['bandage']:FontAwesomeIcons.bandage,['bandcamp']:FontAwesomeIcons.bandcamp,['bangladeshiTakaSign']:FontAwesomeIcons.bangladeshiTakaSign,['barcode']:FontAwesomeIcons.barcode,['bars']:FontAwesomeIcons.bars,['barsProgress']:FontAwesomeIcons.barsProgress,['barsStaggered']:FontAwesomeIcons.barsStaggered,['baseball']:FontAwesomeIcons.baseball,['baseballBatBall']:FontAwesomeIcons.baseballBatBall,['basketShopping']:FontAwesomeIcons.basketShopping,['basketball']:FontAwesomeIcons.basketball,['bath']:FontAwesomeIcons.bath,['batteryEmpty']:FontAwesomeIcons.batteryEmpty,['batteryFull']:FontAwesomeIcons.batteryFull,['batteryHalf']:FontAwesomeIcons.batteryHalf,['batteryQuarter']:FontAwesomeIcons.batteryQuarter,['batteryThreeQuarters']:FontAwesomeIcons.batteryThreeQuarters,['battleNet']:FontAwesomeIcons.battleNet,['bed']:FontAwesomeIcons.bed,['bedPulse']:FontAwesomeIcons.bedPulse,['beerMugEmpty']:FontAwesomeIcons.beerMugEmpty,['behance']:FontAwesomeIcons.behance,['solidBell']:FontAwesomeIcons.solidBell,['bell']:FontAwesomeIcons.bell,['bellConcierge']:FontAwesomeIcons.bellConcierge,['solidBellSlash']:FontAwesomeIcons.solidBellSlash,['bellSlash']:FontAwesomeIcons.bellSlash,['bezierCurve']:FontAwesomeIcons.bezierCurve,['bicycle']:FontAwesomeIcons.bicycle,['bilibili']:FontAwesomeIcons.bilibili,['bimobject']:FontAwesomeIcons.bimobject,['binoculars']:FontAwesomeIcons.binoculars,['biohazard']:FontAwesomeIcons.biohazard,['bitbucket']:FontAwesomeIcons.bitbucket,['bitcoin']:FontAwesomeIcons.bitcoin,['bitcoinSign']:FontAwesomeIcons.bitcoinSign,['bity']:FontAwesomeIcons.bity,['blackTie']:FontAwesomeIcons.blackTie,['blackberry']:FontAwesomeIcons.blackberry,['blender']:FontAwesomeIcons.blender,['blenderPhone']:FontAwesomeIcons.blenderPhone,['blog']:FontAwesomeIcons.blog,['blogger']:FontAwesomeIcons.blogger,['bloggerB']:FontAwesomeIcons.bloggerB,['bluetooth']:FontAwesomeIcons.bluetooth,['bluetoothB']:FontAwesomeIcons.bluetoothB,['bold']:FontAwesomeIcons.bold,['bolt']:FontAwesomeIcons.bolt,['boltLightning']:FontAwesomeIcons.boltLightning,['bomb']:FontAwesomeIcons.bomb,['bone']:FontAwesomeIcons.bone,['bong']:FontAwesomeIcons.bong,['book']:FontAwesomeIcons.book,['bookAtlas']:FontAwesomeIcons.bookAtlas,['bookBible']:FontAwesomeIcons.bookBible,['bookBookmark']:FontAwesomeIcons.bookBookmark,['bookJournalWhills']:FontAwesomeIcons.bookJournalWhills,['bookMedical']:FontAwesomeIcons.bookMedical,['bookOpen']:FontAwesomeIcons.bookOpen,['bookOpenReader']:FontAwesomeIcons.bookOpenReader,['bookQuran']:FontAwesomeIcons.bookQuran,['bookSkull']:FontAwesomeIcons.bookSkull,['bookTanakh']:FontAwesomeIcons.bookTanakh,['solidBookmark']:FontAwesomeIcons.solidBookmark,['bookmark']:FontAwesomeIcons.bookmark,['bootstrap']:FontAwesomeIcons.bootstrap,['borderAll']:FontAwesomeIcons.borderAll,['borderNone']:FontAwesomeIcons.borderNone,['borderTopLeft']:FontAwesomeIcons.borderTopLeft,['boreHole']:FontAwesomeIcons.boreHole,['bots']:FontAwesomeIcons.bots,['bottleDroplet']:FontAwesomeIcons.bottleDroplet,['bottleWater']:FontAwesomeIcons.bottleWater,['bowlFood']:FontAwesomeIcons.bowlFood,['bowlRice']:FontAwesomeIcons.bowlRice,['bowlingBall']:FontAwesomeIcons.bowlingBall,['box']:FontAwesomeIcons.box,['boxArchive']:FontAwesomeIcons.boxArchive,['boxOpen']:FontAwesomeIcons.boxOpen,['boxTissue']:FontAwesomeIcons.boxTissue,['boxesPacking']:FontAwesomeIcons.boxesPacking,['boxesStacked']:FontAwesomeIcons.boxesStacked,['braille']:FontAwesomeIcons.braille,['brain']:FontAwesomeIcons.brain,['brazilianRealSign']:FontAwesomeIcons.brazilianRealSign,['breadSlice']:FontAwesomeIcons.breadSlice,['bridge']:FontAwesomeIcons.bridge,['bridgeCircleCheck']:FontAwesomeIcons.bridgeCircleCheck,['bridgeCircleExclamation']:FontAwesomeIcons.bridgeCircleExclamation,['bridgeCircleXmark']:FontAwesomeIcons.bridgeCircleXmark,['bridgeLock']:FontAwesomeIcons.bridgeLock,['bridgeWater']:FontAwesomeIcons.bridgeWater,['briefcase']:FontAwesomeIcons.briefcase,['briefcaseMedical']:FontAwesomeIcons.briefcaseMedical,['broom']:FontAwesomeIcons.broom,['broomBall']:FontAwesomeIcons.broomBall,['brush']:FontAwesomeIcons.brush,['btc']:FontAwesomeIcons.btc,['bucket']:FontAwesomeIcons.bucket,['buffer']:FontAwesomeIcons.buffer,['bug']:FontAwesomeIcons.bug,['bugSlash']:FontAwesomeIcons.bugSlash,['bugs']:FontAwesomeIcons.bugs,['solidBuilding']:FontAwesomeIcons.solidBuilding,['building']:FontAwesomeIcons.building,['buildingCircleArrowRight']:FontAwesomeIcons.buildingCircleArrowRight,['buildingCircleCheck']:FontAwesomeIcons.buildingCircleCheck,['buildingCircleExclamation']:FontAwesomeIcons.buildingCircleExclamation,['buildingCircleXmark']:FontAwesomeIcons.buildingCircleXmark,['buildingColumns']:FontAwesomeIcons.buildingColumns,['buildingFlag']:FontAwesomeIcons.buildingFlag,['buildingLock']:FontAwesomeIcons.buildingLock,['buildingNgo']:FontAwesomeIcons.buildingNgo,['buildingShield']:FontAwesomeIcons.buildingShield,['buildingUn']:FontAwesomeIcons.buildingUn,['buildingUser']:FontAwesomeIcons.buildingUser,['buildingWheat']:FontAwesomeIcons.buildingWheat,['bullhorn']:FontAwesomeIcons.bullhorn,['bullseye']:FontAwesomeIcons.bullseye,['burger']:FontAwesomeIcons.burger,['buromobelexperte']:FontAwesomeIcons.buromobelexperte,['burst']:FontAwesomeIcons.burst,['bus']:FontAwesomeIcons.bus,['busSimple']:FontAwesomeIcons.busSimple,['businessTime']:FontAwesomeIcons.businessTime,['buyNLarge']:FontAwesomeIcons.buyNLarge,['buysellads']:FontAwesomeIcons.buysellads,['c']:FontAwesomeIcons.c,['cableCar']:FontAwesomeIcons.cableCar,['cakeCandles']:FontAwesomeIcons.cakeCandles,['calculator']:FontAwesomeIcons.calculator,['solidCalendar']:FontAwesomeIcons.solidCalendar,['calendar']:FontAwesomeIcons.calendar,['solidCalendarCheck']:FontAwesomeIcons.solidCalendarCheck,['calendarCheck']:FontAwesomeIcons.calendarCheck,['calendarDay']:FontAwesomeIcons.calendarDay,['solidCalendarDays']:FontAwesomeIcons.solidCalendarDays,['calendarDays']:FontAwesomeIcons.calendarDays,['solidCalendarMinus']:FontAwesomeIcons.solidCalendarMinus,['calendarMinus']:FontAwesomeIcons.calendarMinus,['solidCalendarPlus']:FontAwesomeIcons.solidCalendarPlus,['calendarPlus']:FontAwesomeIcons.calendarPlus,['calendarWeek']:FontAwesomeIcons.calendarWeek,['solidCalendarXmark']:FontAwesomeIcons.solidCalendarXmark,['calendarXmark']:FontAwesomeIcons.calendarXmark,['camera']:FontAwesomeIcons.camera,['cameraRetro']:FontAwesomeIcons.cameraRetro,['cameraRotate']:FontAwesomeIcons.cameraRotate,['campground']:FontAwesomeIcons.campground,['canadianMapleLeaf']:FontAwesomeIcons.canadianMapleLeaf,['candyCane']:FontAwesomeIcons.candyCane,['cannabis']:FontAwesomeIcons.cannabis,['capsules']:FontAwesomeIcons.capsules,['car']:FontAwesomeIcons.car,['carBattery']:FontAwesomeIcons.carBattery,['carBurst']:FontAwesomeIcons.carBurst,['carOn']:FontAwesomeIcons.carOn,['carRear']:FontAwesomeIcons.carRear,['carSide']:FontAwesomeIcons.carSide,['carTunnel']:FontAwesomeIcons.carTunnel,['caravan']:FontAwesomeIcons.caravan,['caretDown']:FontAwesomeIcons.caretDown,['caretLeft']:FontAwesomeIcons.caretLeft,['caretRight']:FontAwesomeIcons.caretRight,['caretUp']:FontAwesomeIcons.caretUp,['carrot']:FontAwesomeIcons.carrot,['cartArrowDown']:FontAwesomeIcons.cartArrowDown,['cartFlatbed']:FontAwesomeIcons.cartFlatbed,['cartFlatbedSuitcase']:FontAwesomeIcons.cartFlatbedSuitcase,['cartPlus']:FontAwesomeIcons.cartPlus,['cartShopping']:FontAwesomeIcons.cartShopping,['cashRegister']:FontAwesomeIcons.cashRegister,['cat']:FontAwesomeIcons.cat,['ccAmazonPay']:FontAwesomeIcons.ccAmazonPay,['ccAmex']:FontAwesomeIcons.ccAmex,['ccApplePay']:FontAwesomeIcons.ccApplePay,['ccDinersClub']:FontAwesomeIcons.ccDinersClub,['ccDiscover']:FontAwesomeIcons.ccDiscover,['ccJcb']:FontAwesomeIcons.ccJcb,['ccMastercard']:FontAwesomeIcons.ccMastercard,['ccPaypal']:FontAwesomeIcons.ccPaypal,['ccStripe']:FontAwesomeIcons.ccStripe,['ccVisa']:FontAwesomeIcons.ccVisa,['cediSign']:FontAwesomeIcons.cediSign,['centSign']:FontAwesomeIcons.centSign,['centercode']:FontAwesomeIcons.centercode,['centos']:FontAwesomeIcons.centos,['certificate']:FontAwesomeIcons.certificate,['chair']:FontAwesomeIcons.chair,['chalkboard']:FontAwesomeIcons.chalkboard,['chalkboardUser']:FontAwesomeIcons.chalkboardUser,['champagneGlasses']:FontAwesomeIcons.champagneGlasses,['chargingStation']:FontAwesomeIcons.chargingStation,['chartArea']:FontAwesomeIcons.chartArea,['solidChartBar']:FontAwesomeIcons.solidChartBar,['chartBar']:FontAwesomeIcons.chartBar,['chartColumn']:FontAwesomeIcons.chartColumn,['chartGantt']:FontAwesomeIcons.chartGantt,['chartLine']:FontAwesomeIcons.chartLine,['chartPie']:FontAwesomeIcons.chartPie,['chartSimple']:FontAwesomeIcons.chartSimple,['check']:FontAwesomeIcons.check,['checkDouble']:FontAwesomeIcons.checkDouble,['checkToSlot']:FontAwesomeIcons.checkToSlot,['cheese']:FontAwesomeIcons.cheese,['chess']:FontAwesomeIcons.chess,['solidChessBishop']:FontAwesomeIcons.solidChessBishop,['chessBishop']:FontAwesomeIcons.chessBishop,['chessBoard']:FontAwesomeIcons.chessBoard,['solidChessKing']:FontAwesomeIcons.solidChessKing,['chessKing']:FontAwesomeIcons.chessKing,['solidChessKnight']:FontAwesomeIcons.solidChessKnight,['chessKnight']:FontAwesomeIcons.chessKnight,['solidChessPawn']:FontAwesomeIcons.solidChessPawn,['chessPawn']:FontAwesomeIcons.chessPawn,['solidChessQueen']:FontAwesomeIcons.solidChessQueen,['chessQueen']:FontAwesomeIcons.chessQueen,['solidChessRook']:FontAwesomeIcons.solidChessRook,['chessRook']:FontAwesomeIcons.chessRook,['chevronDown']:FontAwesomeIcons.chevronDown,['chevronLeft']:FontAwesomeIcons.chevronLeft,['chevronRight']:FontAwesomeIcons.chevronRight,['chevronUp']:FontAwesomeIcons.chevronUp,['child']:FontAwesomeIcons.child,['childCombatant']:FontAwesomeIcons.childCombatant,['childDress']:FontAwesomeIcons.childDress,['childReaching']:FontAwesomeIcons.childReaching,['children']:FontAwesomeIcons.children,['chrome']:FontAwesomeIcons.chrome,['chromecast']:FontAwesomeIcons.chromecast,['church']:FontAwesomeIcons.church,['solidCircle']:FontAwesomeIcons.solidCircle,['circle']:FontAwesomeIcons.circle,['circleArrowDown']:FontAwesomeIcons.circleArrowDown,['circleArrowLeft']:FontAwesomeIcons.circleArrowLeft,['circleArrowRight']:FontAwesomeIcons.circleArrowRight,['circleArrowUp']:FontAwesomeIcons.circleArrowUp,['solidCircleCheck']:FontAwesomeIcons.solidCircleCheck,['circleCheck']:FontAwesomeIcons.circleCheck,['circleChevronDown']:FontAwesomeIcons.circleChevronDown,['circleChevronLeft']:FontAwesomeIcons.circleChevronLeft,['circleChevronRight']:FontAwesomeIcons.circleChevronRight,['circleChevronUp']:FontAwesomeIcons.circleChevronUp,['circleDollarToSlot']:FontAwesomeIcons.circleDollarToSlot,['solidCircleDot']:FontAwesomeIcons.solidCircleDot,['circleDot']:FontAwesomeIcons.circleDot,['solidCircleDown']:FontAwesomeIcons.solidCircleDown,['circleDown']:FontAwesomeIcons.circleDown,['circleExclamation']:FontAwesomeIcons.circleExclamation,['circleH']:FontAwesomeIcons.circleH,['circleHalfStroke']:FontAwesomeIcons.circleHalfStroke,['circleInfo']:FontAwesomeIcons.circleInfo,['solidCircleLeft']:FontAwesomeIcons.solidCircleLeft,['circleLeft']:FontAwesomeIcons.circleLeft,['circleMinus']:FontAwesomeIcons.circleMinus,['circleNodes']:FontAwesomeIcons.circleNodes,['circleNotch']:FontAwesomeIcons.circleNotch,['solidCirclePause']:FontAwesomeIcons.solidCirclePause,['circlePause']:FontAwesomeIcons.circlePause,['solidCirclePlay']:FontAwesomeIcons.solidCirclePlay,['circlePlay']:FontAwesomeIcons.circlePlay,['circlePlus']:FontAwesomeIcons.circlePlus,['solidCircleQuestion']:FontAwesomeIcons.solidCircleQuestion,['circleQuestion']:FontAwesomeIcons.circleQuestion,['circleRadiation']:FontAwesomeIcons.circleRadiation,['solidCircleRight']:FontAwesomeIcons.solidCircleRight,['circleRight']:FontAwesomeIcons.circleRight,['solidCircleStop']:FontAwesomeIcons.solidCircleStop,['circleStop']:FontAwesomeIcons.circleStop,['solidCircleUp']:FontAwesomeIcons.solidCircleUp,['circleUp']:FontAwesomeIcons.circleUp,['solidCircleUser']:FontAwesomeIcons.solidCircleUser,['circleUser']:FontAwesomeIcons.circleUser,['solidCircleXmark']:FontAwesomeIcons.solidCircleXmark,['circleXmark']:FontAwesomeIcons.circleXmark,['city']:FontAwesomeIcons.city,['clapperboard']:FontAwesomeIcons.clapperboard,['solidClipboard']:FontAwesomeIcons.solidClipboard,['clipboard']:FontAwesomeIcons.clipboard,['clipboardCheck']:FontAwesomeIcons.clipboardCheck,['clipboardList']:FontAwesomeIcons.clipboardList,['clipboardQuestion']:FontAwesomeIcons.clipboardQuestion,['clipboardUser']:FontAwesomeIcons.clipboardUser,['solidClock']:FontAwesomeIcons.solidClock,['clock']:FontAwesomeIcons.clock,['clockRotateLeft']:FontAwesomeIcons.clockRotateLeft,['solidClone']:FontAwesomeIcons.solidClone,['clone']:FontAwesomeIcons.clone,['solidClosedCaptioning']:FontAwesomeIcons.solidClosedCaptioning,['closedCaptioning']:FontAwesomeIcons.closedCaptioning,['cloud']:FontAwesomeIcons.cloud,['cloudArrowDown']:FontAwesomeIcons.cloudArrowDown,['cloudArrowUp']:FontAwesomeIcons.cloudArrowUp,['cloudBolt']:FontAwesomeIcons.cloudBolt,['cloudMeatball']:FontAwesomeIcons.cloudMeatball,['cloudMoon']:FontAwesomeIcons.cloudMoon,['cloudMoonRain']:FontAwesomeIcons.cloudMoonRain,['cloudRain']:FontAwesomeIcons.cloudRain,['cloudShowersHeavy']:FontAwesomeIcons.cloudShowersHeavy,['cloudShowersWater']:FontAwesomeIcons.cloudShowersWater,['cloudSun']:FontAwesomeIcons.cloudSun,['cloudSunRain']:FontAwesomeIcons.cloudSunRain,['cloudflare']:FontAwesomeIcons.cloudflare,['cloudscale']:FontAwesomeIcons.cloudscale,['cloudsmith']:FontAwesomeIcons.cloudsmith,['cloudversify']:FontAwesomeIcons.cloudversify,['clover']:FontAwesomeIcons.clover,['cmplid']:FontAwesomeIcons.cmplid,['code']:FontAwesomeIcons.code,['codeBranch']:FontAwesomeIcons.codeBranch,['codeCommit']:FontAwesomeIcons.codeCommit,['codeCompare']:FontAwesomeIcons.codeCompare,['codeFork']:FontAwesomeIcons.codeFork,['codeMerge']:FontAwesomeIcons.codeMerge,['codePullRequest']:FontAwesomeIcons.codePullRequest,['codepen']:FontAwesomeIcons.codepen,['codiepie']:FontAwesomeIcons.codiepie,['coins']:FontAwesomeIcons.coins,['colonSign']:FontAwesomeIcons.colonSign,['solidComment']:FontAwesomeIcons.solidComment,['comment']:FontAwesomeIcons.comment,['commentDollar']:FontAwesomeIcons.commentDollar,['solidCommentDots']:FontAwesomeIcons.solidCommentDots,['commentDots']:FontAwesomeIcons.commentDots,['commentMedical']:FontAwesomeIcons.commentMedical,['commentSlash']:FontAwesomeIcons.commentSlash,['commentSms']:FontAwesomeIcons.commentSms,['solidComments']:FontAwesomeIcons.solidComments,['comments']:FontAwesomeIcons.comments,['commentsDollar']:FontAwesomeIcons.commentsDollar,['compactDisc']:FontAwesomeIcons.compactDisc,['solidCompass']:FontAwesomeIcons.solidCompass,['compass']:FontAwesomeIcons.compass,['compassDrafting']:FontAwesomeIcons.compassDrafting,['compress']:FontAwesomeIcons.compress,['computer']:FontAwesomeIcons.computer,['computerMouse']:FontAwesomeIcons.computerMouse,['confluence']:FontAwesomeIcons.confluence,['connectdevelop']:FontAwesomeIcons.connectdevelop,['contao']:FontAwesomeIcons.contao,['cookie']:FontAwesomeIcons.cookie,['cookieBite']:FontAwesomeIcons.cookieBite,['solidCopy']:FontAwesomeIcons.solidCopy,['copy']:FontAwesomeIcons.copy,['solidCopyright']:FontAwesomeIcons.solidCopyright,['copyright']:FontAwesomeIcons.copyright,['cottonBureau']:FontAwesomeIcons.cottonBureau,['couch']:FontAwesomeIcons.couch,['cow']:FontAwesomeIcons.cow,['cpanel']:FontAwesomeIcons.cpanel,['creativeCommons']:FontAwesomeIcons.creativeCommons,['creativeCommonsBy']:FontAwesomeIcons.creativeCommonsBy,['creativeCommonsNc']:FontAwesomeIcons.creativeCommonsNc,['creativeCommonsNcEu']:FontAwesomeIcons.creativeCommonsNcEu,['creativeCommonsNcJp']:FontAwesomeIcons.creativeCommonsNcJp,['creativeCommonsNd']:FontAwesomeIcons.creativeCommonsNd,['creativeCommonsPd']:FontAwesomeIcons.creativeCommonsPd,['creativeCommonsPdAlt']:FontAwesomeIcons.creativeCommonsPdAlt,['creativeCommonsRemix']:FontAwesomeIcons.creativeCommonsRemix,['creativeCommonsSa']:FontAwesomeIcons.creativeCommonsSa,['creativeCommonsSampling']:FontAwesomeIcons.creativeCommonsSampling,['creativeCommonsSamplingPlus']:FontAwesomeIcons.creativeCommonsSamplingPlus,['creativeCommonsShare']:FontAwesomeIcons.creativeCommonsShare,['creativeCommonsZero']:FontAwesomeIcons.creativeCommonsZero,['solidCreditCard']:FontAwesomeIcons.solidCreditCard,['creditCard']:FontAwesomeIcons.creditCard,['criticalRole']:FontAwesomeIcons.criticalRole,['crop']:FontAwesomeIcons.crop,['cropSimple']:FontAwesomeIcons.cropSimple,['cross']:FontAwesomeIcons.cross,['crosshairs']:FontAwesomeIcons.crosshairs,['crow']:FontAwesomeIcons.crow,['crown']:FontAwesomeIcons.crown,['crutch']:FontAwesomeIcons.crutch,['cruzeiroSign']:FontAwesomeIcons.cruzeiroSign,['css3']:FontAwesomeIcons.css3,['css3Alt']:FontAwesomeIcons.css3Alt,['cube']:FontAwesomeIcons.cube,['cubes']:FontAwesomeIcons.cubes,['cubesStacked']:FontAwesomeIcons.cubesStacked,['cuttlefish']:FontAwesomeIcons.cuttlefish,['d']:FontAwesomeIcons.d,['dAndD']:FontAwesomeIcons.dAndD,['dAndDBeyond']:FontAwesomeIcons.dAndDBeyond,['dailymotion']:FontAwesomeIcons.dailymotion,['dashcube']:FontAwesomeIcons.dashcube,['database']:FontAwesomeIcons.database,['deezer']:FontAwesomeIcons.deezer,['deleteLeft']:FontAwesomeIcons.deleteLeft,['delicious']:FontAwesomeIcons.delicious,['democrat']:FontAwesomeIcons.democrat,['deploydog']:FontAwesomeIcons.deploydog,['deskpro']:FontAwesomeIcons.deskpro,['desktop']:FontAwesomeIcons.desktop,['dev']:FontAwesomeIcons.dev,['deviantart']:FontAwesomeIcons.deviantart,['dharmachakra']:FontAwesomeIcons.dharmachakra,['dhl']:FontAwesomeIcons.dhl,['diagramNext']:FontAwesomeIcons.diagramNext,['diagramPredecessor']:FontAwesomeIcons.diagramPredecessor,['diagramProject']:FontAwesomeIcons.diagramProject,['diagramSuccessor']:FontAwesomeIcons.diagramSuccessor,['diamond']:FontAwesomeIcons.diamond,['diamondTurnRight']:FontAwesomeIcons.diamondTurnRight,['diaspora']:FontAwesomeIcons.diaspora,['dice']:FontAwesomeIcons.dice,['diceD20']:FontAwesomeIcons.diceD20,['diceD6']:FontAwesomeIcons.diceD6,['diceFive']:FontAwesomeIcons.diceFive,['diceFour']:FontAwesomeIcons.diceFour,['diceOne']:FontAwesomeIcons.diceOne,['diceSix']:FontAwesomeIcons.diceSix,['diceThree']:FontAwesomeIcons.diceThree,['diceTwo']:FontAwesomeIcons.diceTwo,['digg']:FontAwesomeIcons.digg,['digitalOcean']:FontAwesomeIcons.digitalOcean,['discord']:FontAwesomeIcons.discord,['discourse']:FontAwesomeIcons.discourse,['disease']:FontAwesomeIcons.disease,['display']:FontAwesomeIcons.display,['divide']:FontAwesomeIcons.divide,['dna']:FontAwesomeIcons.dna,['dochub']:FontAwesomeIcons.dochub,['docker']:FontAwesomeIcons.docker,['dog']:FontAwesomeIcons.dog,['dollarSign']:FontAwesomeIcons.dollarSign,['dolly']:FontAwesomeIcons.dolly,['dongSign']:FontAwesomeIcons.dongSign,['doorClosed']:FontAwesomeIcons.doorClosed,['doorOpen']:FontAwesomeIcons.doorOpen,['dove']:FontAwesomeIcons.dove,['downLeftAndUpRightToCenter']:FontAwesomeIcons.downLeftAndUpRightToCenter,['downLong']:FontAwesomeIcons.downLong,['download']:FontAwesomeIcons.download,['draft2digital']:FontAwesomeIcons.draft2digital,['dragon']:FontAwesomeIcons.dragon,['drawPolygon']:FontAwesomeIcons.drawPolygon,['dribbble']:FontAwesomeIcons.dribbble,['dropbox']:FontAwesomeIcons.dropbox,['droplet']:FontAwesomeIcons.droplet,['dropletSlash']:FontAwesomeIcons.dropletSlash,['drum']:FontAwesomeIcons.drum,['drumSteelpan']:FontAwesomeIcons.drumSteelpan,['drumstickBite']:FontAwesomeIcons.drumstickBite,['drupal']:FontAwesomeIcons.drupal,['dumbbell']:FontAwesomeIcons.dumbbell,['dumpster']:FontAwesomeIcons.dumpster,['dumpsterFire']:FontAwesomeIcons.dumpsterFire,['dungeon']:FontAwesomeIcons.dungeon,['dyalog']:FontAwesomeIcons.dyalog,['e']:FontAwesomeIcons.e,['earDeaf']:FontAwesomeIcons.earDeaf,['earListen']:FontAwesomeIcons.earListen,['earlybirds']:FontAwesomeIcons.earlybirds,['earthAfrica']:FontAwesomeIcons.earthAfrica,['earthAmericas']:FontAwesomeIcons.earthAmericas,['earthAsia']:FontAwesomeIcons.earthAsia,['earthEurope']:FontAwesomeIcons.earthEurope,['earthOceania']:FontAwesomeIcons.earthOceania,['ebay']:FontAwesomeIcons.ebay,['edge']:FontAwesomeIcons.edge,['edgeLegacy']:FontAwesomeIcons.edgeLegacy,['egg']:FontAwesomeIcons.egg,['eject']:FontAwesomeIcons.eject,['elementor']:FontAwesomeIcons.elementor,['elevator']:FontAwesomeIcons.elevator,['ellipsis']:FontAwesomeIcons.ellipsis,['ellipsisVertical']:FontAwesomeIcons.ellipsisVertical,['ello']:FontAwesomeIcons.ello,['ember']:FontAwesomeIcons.ember,['empire']:FontAwesomeIcons.empire,['solidEnvelope']:FontAwesomeIcons.solidEnvelope,['envelope']:FontAwesomeIcons.envelope,['envelopeCircleCheck']:FontAwesomeIcons.envelopeCircleCheck,['solidEnvelopeOpen']:FontAwesomeIcons.solidEnvelopeOpen,['envelopeOpen']:FontAwesomeIcons.envelopeOpen,['envelopeOpenText']:FontAwesomeIcons.envelopeOpenText,['envelopesBulk']:FontAwesomeIcons.envelopesBulk,['envira']:FontAwesomeIcons.envira,['equals']:FontAwesomeIcons.equals,['eraser']:FontAwesomeIcons.eraser,['erlang']:FontAwesomeIcons.erlang,['ethereum']:FontAwesomeIcons.ethereum,['ethernet']:FontAwesomeIcons.ethernet,['etsy']:FontAwesomeIcons.etsy,['euroSign']:FontAwesomeIcons.euroSign,['evernote']:FontAwesomeIcons.evernote,['exclamation']:FontAwesomeIcons.exclamation,['expand']:FontAwesomeIcons.expand,['expeditedssl']:FontAwesomeIcons.expeditedssl,['explosion']:FontAwesomeIcons.explosion,['solidEye']:FontAwesomeIcons.solidEye,['eye']:FontAwesomeIcons.eye,['eyeDropper']:FontAwesomeIcons.eyeDropper,['eyeLowVision']:FontAwesomeIcons.eyeLowVision,['solidEyeSlash']:FontAwesomeIcons.solidEyeSlash,['eyeSlash']:FontAwesomeIcons.eyeSlash,['f']:FontAwesomeIcons.f,['solidFaceAngry']:FontAwesomeIcons.solidFaceAngry,['faceAngry']:FontAwesomeIcons.faceAngry,['solidFaceDizzy']:FontAwesomeIcons.solidFaceDizzy,['faceDizzy']:FontAwesomeIcons.faceDizzy,['solidFaceFlushed']:FontAwesomeIcons.solidFaceFlushed,['faceFlushed']:FontAwesomeIcons.faceFlushed,['solidFaceFrown']:FontAwesomeIcons.solidFaceFrown,['faceFrown']:FontAwesomeIcons.faceFrown,['solidFaceFrownOpen']:FontAwesomeIcons.solidFaceFrownOpen,['faceFrownOpen']:FontAwesomeIcons.faceFrownOpen,['solidFaceGrimace']:FontAwesomeIcons.solidFaceGrimace,['faceGrimace']:FontAwesomeIcons.faceGrimace,['solidFaceGrin']:FontAwesomeIcons.solidFaceGrin,['faceGrin']:FontAwesomeIcons.faceGrin,['solidFaceGrinBeam']:FontAwesomeIcons.solidFaceGrinBeam,['faceGrinBeam']:FontAwesomeIcons.faceGrinBeam,['solidFaceGrinBeamSweat']:FontAwesomeIcons.solidFaceGrinBeamSweat,['faceGrinBeamSweat']:FontAwesomeIcons.faceGrinBeamSweat,['solidFaceGrinHearts']:FontAwesomeIcons.solidFaceGrinHearts,['faceGrinHearts']:FontAwesomeIcons.faceGrinHearts,['solidFaceGrinSquint']:FontAwesomeIcons.solidFaceGrinSquint,['faceGrinSquint']:FontAwesomeIcons.faceGrinSquint,['solidFaceGrinSquintTears']:FontAwesomeIcons.solidFaceGrinSquintTears,['faceGrinSquintTears']:FontAwesomeIcons.faceGrinSquintTears,['solidFaceGrinStars']:FontAwesomeIcons.solidFaceGrinStars,['faceGrinStars']:FontAwesomeIcons.faceGrinStars,['solidFaceGrinTears']:FontAwesomeIcons.solidFaceGrinTears,['faceGrinTears']:FontAwesomeIcons.faceGrinTears,['solidFaceGrinTongue']:FontAwesomeIcons.solidFaceGrinTongue,['faceGrinTongue']:FontAwesomeIcons.faceGrinTongue,['solidFaceGrinTongueSquint']:FontAwesomeIcons.solidFaceGrinTongueSquint,['faceGrinTongueSquint']:FontAwesomeIcons.faceGrinTongueSquint,['solidFaceGrinTongueWink']:FontAwesomeIcons.solidFaceGrinTongueWink,['faceGrinTongueWink']:FontAwesomeIcons.faceGrinTongueWink,['solidFaceGrinWide']:FontAwesomeIcons.solidFaceGrinWide,['faceGrinWide']:FontAwesomeIcons.faceGrinWide,['solidFaceGrinWink']:FontAwesomeIcons.solidFaceGrinWink,['faceGrinWink']:FontAwesomeIcons.faceGrinWink,['solidFaceKiss']:FontAwesomeIcons.solidFaceKiss,['faceKiss']:FontAwesomeIcons.faceKiss,['solidFaceKissBeam']:FontAwesomeIcons.solidFaceKissBeam,['faceKissBeam']:FontAwesomeIcons.faceKissBeam,['solidFaceKissWinkHeart']:FontAwesomeIcons.solidFaceKissWinkHeart,['faceKissWinkHeart']:FontAwesomeIcons.faceKissWinkHeart,['solidFaceLaugh']:FontAwesomeIcons.solidFaceLaugh,['faceLaugh']:FontAwesomeIcons.faceLaugh,['solidFaceLaughBeam']:FontAwesomeIcons.solidFaceLaughBeam,['faceLaughBeam']:FontAwesomeIcons.faceLaughBeam,['solidFaceLaughSquint']:FontAwesomeIcons.solidFaceLaughSquint,['faceLaughSquint']:FontAwesomeIcons.faceLaughSquint,['solidFaceLaughWink']:FontAwesomeIcons.solidFaceLaughWink,['faceLaughWink']:FontAwesomeIcons.faceLaughWink,['solidFaceMeh']:FontAwesomeIcons.solidFaceMeh,['faceMeh']:FontAwesomeIcons.faceMeh,['solidFaceMehBlank']:FontAwesomeIcons.solidFaceMehBlank,['faceMehBlank']:FontAwesomeIcons.faceMehBlank,['solidFaceRollingEyes']:FontAwesomeIcons.solidFaceRollingEyes,['faceRollingEyes']:FontAwesomeIcons.faceRollingEyes,['solidFaceSadCry']:FontAwesomeIcons.solidFaceSadCry,['faceSadCry']:FontAwesomeIcons.faceSadCry,['solidFaceSadTear']:FontAwesomeIcons.solidFaceSadTear,['faceSadTear']:FontAwesomeIcons.faceSadTear,['solidFaceSmile']:FontAwesomeIcons.solidFaceSmile,['faceSmile']:FontAwesomeIcons.faceSmile,['solidFaceSmileBeam']:FontAwesomeIcons.solidFaceSmileBeam,['faceSmileBeam']:FontAwesomeIcons.faceSmileBeam,['solidFaceSmileWink']:FontAwesomeIcons.solidFaceSmileWink,['faceSmileWink']:FontAwesomeIcons.faceSmileWink,['solidFaceSurprise']:FontAwesomeIcons.solidFaceSurprise,['faceSurprise']:FontAwesomeIcons.faceSurprise,['solidFaceTired']:FontAwesomeIcons.solidFaceTired,['faceTired']:FontAwesomeIcons.faceTired,['facebook']:FontAwesomeIcons.facebook,['facebookF']:FontAwesomeIcons.facebookF,['facebookMessenger']:FontAwesomeIcons.facebookMessenger,['fan']:FontAwesomeIcons.fan,['fantasyFlightGames']:FontAwesomeIcons.fantasyFlightGames,['faucet']:FontAwesomeIcons.faucet,['faucetDrip']:FontAwesomeIcons.faucetDrip,['fax']:FontAwesomeIcons.fax,['feather']:FontAwesomeIcons.feather,['featherPointed']:FontAwesomeIcons.featherPointed,['fedex']:FontAwesomeIcons.fedex,['fedora']:FontAwesomeIcons.fedora,['ferry']:FontAwesomeIcons.ferry,['figma']:FontAwesomeIcons.figma,['solidFile']:FontAwesomeIcons.solidFile,['file']:FontAwesomeIcons.file,['fileArrowDown']:FontAwesomeIcons.fileArrowDown,['fileArrowUp']:FontAwesomeIcons.fileArrowUp,['solidFileAudio']:FontAwesomeIcons.solidFileAudio,['fileAudio']:FontAwesomeIcons.fileAudio,['fileCircleCheck']:FontAwesomeIcons.fileCircleCheck,['fileCircleExclamation']:FontAwesomeIcons.fileCircleExclamation,['fileCircleMinus']:FontAwesomeIcons.fileCircleMinus,['fileCirclePlus']:FontAwesomeIcons.fileCirclePlus,['fileCircleQuestion']:FontAwesomeIcons.fileCircleQuestion,['fileCircleXmark']:FontAwesomeIcons.fileCircleXmark,['solidFileCode']:FontAwesomeIcons.solidFileCode,['fileCode']:FontAwesomeIcons.fileCode,['fileContract']:FontAwesomeIcons.fileContract,['fileCsv']:FontAwesomeIcons.fileCsv,['solidFileExcel']:FontAwesomeIcons.solidFileExcel,['fileExcel']:FontAwesomeIcons.fileExcel,['fileExport']:FontAwesomeIcons.fileExport,['solidFileImage']:FontAwesomeIcons.solidFileImage,['fileImage']:FontAwesomeIcons.fileImage,['fileImport']:FontAwesomeIcons.fileImport,['fileInvoice']:FontAwesomeIcons.fileInvoice,['fileInvoiceDollar']:FontAwesomeIcons.fileInvoiceDollar,['solidFileLines']:FontAwesomeIcons.solidFileLines,['fileLines']:FontAwesomeIcons.fileLines,['fileMedical']:FontAwesomeIcons.fileMedical,['solidFilePdf']:FontAwesomeIcons.solidFilePdf,['filePdf']:FontAwesomeIcons.filePdf,['filePen']:FontAwesomeIcons.filePen,['solidFilePowerpoint']:FontAwesomeIcons.solidFilePowerpoint,['filePowerpoint']:FontAwesomeIcons.filePowerpoint,['filePrescription']:FontAwesomeIcons.filePrescription,['fileShield']:FontAwesomeIcons.fileShield,['fileSignature']:FontAwesomeIcons.fileSignature,['solidFileVideo']:FontAwesomeIcons.solidFileVideo,['fileVideo']:FontAwesomeIcons.fileVideo,['fileWaveform']:FontAwesomeIcons.fileWaveform,['solidFileWord']:FontAwesomeIcons.solidFileWord,['fileWord']:FontAwesomeIcons.fileWord,['solidFileZipper']:FontAwesomeIcons.solidFileZipper,['fileZipper']:FontAwesomeIcons.fileZipper,['fill']:FontAwesomeIcons.fill,['fillDrip']:FontAwesomeIcons.fillDrip,['film']:FontAwesomeIcons.film,['filter']:FontAwesomeIcons.filter,['filterCircleDollar']:FontAwesomeIcons.filterCircleDollar,['filterCircleXmark']:FontAwesomeIcons.filterCircleXmark,['fingerprint']:FontAwesomeIcons.fingerprint,['fire']:FontAwesomeIcons.fire,['fireBurner']:FontAwesomeIcons.fireBurner,['fireExtinguisher']:FontAwesomeIcons.fireExtinguisher,['fireFlameCurved']:FontAwesomeIcons.fireFlameCurved,['fireFlameSimple']:FontAwesomeIcons.fireFlameSimple,['firefox']:FontAwesomeIcons.firefox,['firefoxBrowser']:FontAwesomeIcons.firefoxBrowser,['firstOrder']:FontAwesomeIcons.firstOrder,['firstOrderAlt']:FontAwesomeIcons.firstOrderAlt,['firstdraft']:FontAwesomeIcons.firstdraft,['fish']:FontAwesomeIcons.fish,['fishFins']:FontAwesomeIcons.fishFins,['solidFlag']:FontAwesomeIcons.solidFlag,['flag']:FontAwesomeIcons.flag,['flagCheckered']:FontAwesomeIcons.flagCheckered,['flagUsa']:FontAwesomeIcons.flagUsa,['flask']:FontAwesomeIcons.flask,['flaskVial']:FontAwesomeIcons.flaskVial,['flickr']:FontAwesomeIcons.flickr,['flipboard']:FontAwesomeIcons.flipboard,['solidFloppyDisk']:FontAwesomeIcons.solidFloppyDisk,['floppyDisk']:FontAwesomeIcons.floppyDisk,['florinSign']:FontAwesomeIcons.florinSign,['fly']:FontAwesomeIcons.fly,['solidFolder']:FontAwesomeIcons.solidFolder,['folder']:FontAwesomeIcons.folder,['solidFolderClosed']:FontAwesomeIcons.solidFolderClosed,['folderClosed']:FontAwesomeIcons.folderClosed,['folderMinus']:FontAwesomeIcons.folderMinus,['solidFolderOpen']:FontAwesomeIcons.solidFolderOpen,['folderOpen']:FontAwesomeIcons.folderOpen,['folderPlus']:FontAwesomeIcons.folderPlus,['folderTree']:FontAwesomeIcons.folderTree,['font']:FontAwesomeIcons.font,['solidFontAwesome']:FontAwesomeIcons.solidFontAwesome,['fontAwesome']:FontAwesomeIcons.fontAwesome,['brandsFontAwesome']:FontAwesomeIcons.brandsFontAwesome,['fonticons']:FontAwesomeIcons.fonticons,['fonticonsFi']:FontAwesomeIcons.fonticonsFi,['football']:FontAwesomeIcons.football,['fortAwesome']:FontAwesomeIcons.fortAwesome,['fortAwesomeAlt']:FontAwesomeIcons.fortAwesomeAlt,['forumbee']:FontAwesomeIcons.forumbee,['forward']:FontAwesomeIcons.forward,['forwardFast']:FontAwesomeIcons.forwardFast,['forwardStep']:FontAwesomeIcons.forwardStep,['foursquare']:FontAwesomeIcons.foursquare,['francSign']:FontAwesomeIcons.francSign,['freeCodeCamp']:FontAwesomeIcons.freeCodeCamp,['freebsd']:FontAwesomeIcons.freebsd,['frog']:FontAwesomeIcons.frog,['fulcrum']:FontAwesomeIcons.fulcrum,['solidFutbol']:FontAwesomeIcons.solidFutbol,['futbol']:FontAwesomeIcons.futbol,['g']:FontAwesomeIcons.g,['galacticRepublic']:FontAwesomeIcons.galacticRepublic,['galacticSenate']:FontAwesomeIcons.galacticSenate,['gamepad']:FontAwesomeIcons.gamepad,['gasPump']:FontAwesomeIcons.gasPump,['gauge']:FontAwesomeIcons.gauge,['gaugeHigh']:FontAwesomeIcons.gaugeHigh,['gaugeSimple']:FontAwesomeIcons.gaugeSimple,['gaugeSimpleHigh']:FontAwesomeIcons.gaugeSimpleHigh,['gavel']:FontAwesomeIcons.gavel,['gear']:FontAwesomeIcons.gear,['gears']:FontAwesomeIcons.gears,['solidGem']:FontAwesomeIcons.solidGem,['gem']:FontAwesomeIcons.gem,['genderless']:FontAwesomeIcons.genderless,['getPocket']:FontAwesomeIcons.getPocket,['gg']:FontAwesomeIcons.gg,['ggCircle']:FontAwesomeIcons.ggCircle,['ghost']:FontAwesomeIcons.ghost,['gift']:FontAwesomeIcons.gift,['gifts']:FontAwesomeIcons.gifts,['git']:FontAwesomeIcons.git,['gitAlt']:FontAwesomeIcons.gitAlt,['github']:FontAwesomeIcons.github,['githubAlt']:FontAwesomeIcons.githubAlt,['gitkraken']:FontAwesomeIcons.gitkraken,['gitlab']:FontAwesomeIcons.gitlab,['gitter']:FontAwesomeIcons.gitter,['glassWater']:FontAwesomeIcons.glassWater,['glassWaterDroplet']:FontAwesomeIcons.glassWaterDroplet,['glasses']:FontAwesomeIcons.glasses,['glide']:FontAwesomeIcons.glide,['glideG']:FontAwesomeIcons.glideG,['globe']:FontAwesomeIcons.globe,['gofore']:FontAwesomeIcons.gofore,['golang']:FontAwesomeIcons.golang,['golfBallTee']:FontAwesomeIcons.golfBallTee,['goodreads']:FontAwesomeIcons.goodreads,['goodreadsG']:FontAwesomeIcons.goodreadsG,['google']:FontAwesomeIcons.google,['googleDrive']:FontAwesomeIcons.googleDrive,['googlePay']:FontAwesomeIcons.googlePay,['googlePlay']:FontAwesomeIcons.googlePlay,['googlePlus']:FontAwesomeIcons.googlePlus,['googlePlusG']:FontAwesomeIcons.googlePlusG,['googleWallet']:FontAwesomeIcons.googleWallet,['gopuram']:FontAwesomeIcons.gopuram,['graduationCap']:FontAwesomeIcons.graduationCap,['gratipay']:FontAwesomeIcons.gratipay,['grav']:FontAwesomeIcons.grav,['greaterThan']:FontAwesomeIcons.greaterThan,['greaterThanEqual']:FontAwesomeIcons.greaterThanEqual,['grip']:FontAwesomeIcons.grip,['gripLines']:FontAwesomeIcons.gripLines,['gripLinesVertical']:FontAwesomeIcons.gripLinesVertical,['gripVertical']:FontAwesomeIcons.gripVertical,['gripfire']:FontAwesomeIcons.gripfire,['groupArrowsRotate']:FontAwesomeIcons.groupArrowsRotate,['grunt']:FontAwesomeIcons.grunt,['guaraniSign']:FontAwesomeIcons.guaraniSign,['guilded']:FontAwesomeIcons.guilded,['guitar']:FontAwesomeIcons.guitar,['gulp']:FontAwesomeIcons.gulp,['gun']:FontAwesomeIcons.gun,['h']:FontAwesomeIcons.h,['hackerNews']:FontAwesomeIcons.hackerNews,['hackerrank']:FontAwesomeIcons.hackerrank,['hammer']:FontAwesomeIcons.hammer,['hamsa']:FontAwesomeIcons.hamsa,['solidHand']:FontAwesomeIcons.solidHand,['hand']:FontAwesomeIcons.hand,['solidHandBackFist']:FontAwesomeIcons.solidHandBackFist,['handBackFist']:FontAwesomeIcons.handBackFist,['handDots']:FontAwesomeIcons.handDots,['handFist']:FontAwesomeIcons.handFist,['handHolding']:FontAwesomeIcons.handHolding,['handHoldingDollar']:FontAwesomeIcons.handHoldingDollar,['handHoldingDroplet']:FontAwesomeIcons.handHoldingDroplet,['handHoldingHand']:FontAwesomeIcons.handHoldingHand,['handHoldingHeart']:FontAwesomeIcons.handHoldingHeart,['handHoldingMedical']:FontAwesomeIcons.handHoldingMedical,['solidHandLizard']:FontAwesomeIcons.solidHandLizard,['handLizard']:FontAwesomeIcons.handLizard,['handMiddleFinger']:FontAwesomeIcons.handMiddleFinger,['solidHandPeace']:FontAwesomeIcons.solidHandPeace,['handPeace']:FontAwesomeIcons.handPeace,['solidHandPointDown']:FontAwesomeIcons.solidHandPointDown,['handPointDown']:FontAwesomeIcons.handPointDown,['solidHandPointLeft']:FontAwesomeIcons.solidHandPointLeft,['handPointLeft']:FontAwesomeIcons.handPointLeft,['solidHandPointRight']:FontAwesomeIcons.solidHandPointRight,['handPointRight']:FontAwesomeIcons.handPointRight,['solidHandPointUp']:FontAwesomeIcons.solidHandPointUp,['handPointUp']:FontAwesomeIcons.handPointUp,['solidHandPointer']:FontAwesomeIcons.solidHandPointer,['handPointer']:FontAwesomeIcons.handPointer,['solidHandScissors']:FontAwesomeIcons.solidHandScissors,['handScissors']:FontAwesomeIcons.handScissors,['handSparkles']:FontAwesomeIcons.handSparkles,['solidHandSpock']:FontAwesomeIcons.solidHandSpock,['handSpock']:FontAwesomeIcons.handSpock,['handcuffs']:FontAwesomeIcons.handcuffs,['hands']:FontAwesomeIcons.hands,['handsAslInterpreting']:FontAwesomeIcons.handsAslInterpreting,['handsBound']:FontAwesomeIcons.handsBound,['handsBubbles']:FontAwesomeIcons.handsBubbles,['handsClapping']:FontAwesomeIcons.handsClapping,['handsHolding']:FontAwesomeIcons.handsHolding,['handsHoldingChild']:FontAwesomeIcons.handsHoldingChild,['handsHoldingCircle']:FontAwesomeIcons.handsHoldingCircle,['handsPraying']:FontAwesomeIcons.handsPraying,['solidHandshake']:FontAwesomeIcons.solidHandshake,['handshake']:FontAwesomeIcons.handshake,['handshakeAngle']:FontAwesomeIcons.handshakeAngle,['handshakeSimple']:FontAwesomeIcons.handshakeSimple,['handshakeSimpleSlash']:FontAwesomeIcons.handshakeSimpleSlash,['handshakeSlash']:FontAwesomeIcons.handshakeSlash,['hanukiah']:FontAwesomeIcons.hanukiah,['solidHardDrive']:FontAwesomeIcons.solidHardDrive,['hardDrive']:FontAwesomeIcons.hardDrive,['hashnode']:FontAwesomeIcons.hashnode,['hashtag']:FontAwesomeIcons.hashtag,['hatCowboy']:FontAwesomeIcons.hatCowboy,['hatCowboySide']:FontAwesomeIcons.hatCowboySide,['hatWizard']:FontAwesomeIcons.hatWizard,['headSideCough']:FontAwesomeIcons.headSideCough,['headSideCoughSlash']:FontAwesomeIcons.headSideCoughSlash,['headSideMask']:FontAwesomeIcons.headSideMask,['headSideVirus']:FontAwesomeIcons.headSideVirus,['heading']:FontAwesomeIcons.heading,['headphones']:FontAwesomeIcons.headphones,['headphonesSimple']:FontAwesomeIcons.headphonesSimple,['headset']:FontAwesomeIcons.headset,['solidHeart']:FontAwesomeIcons.solidHeart,['heart']:FontAwesomeIcons.heart,['heartCircleBolt']:FontAwesomeIcons.heartCircleBolt,['heartCircleCheck']:FontAwesomeIcons.heartCircleCheck,['heartCircleExclamation']:FontAwesomeIcons.heartCircleExclamation,['heartCircleMinus']:FontAwesomeIcons.heartCircleMinus,['heartCirclePlus']:FontAwesomeIcons.heartCirclePlus,['heartCircleXmark']:FontAwesomeIcons.heartCircleXmark,['heartCrack']:FontAwesomeIcons.heartCrack,['heartPulse']:FontAwesomeIcons.heartPulse,['helicopter']:FontAwesomeIcons.helicopter,['helicopterSymbol']:FontAwesomeIcons.helicopterSymbol,['helmetSafety']:FontAwesomeIcons.helmetSafety,['helmetUn']:FontAwesomeIcons.helmetUn,['highlighter']:FontAwesomeIcons.highlighter,['hillAvalanche']:FontAwesomeIcons.hillAvalanche,['hillRockslide']:FontAwesomeIcons.hillRockslide,['hippo']:FontAwesomeIcons.hippo,['hips']:FontAwesomeIcons.hips,['hireAHelper']:FontAwesomeIcons.hireAHelper,['hive']:FontAwesomeIcons.hive,['hockeyPuck']:FontAwesomeIcons.hockeyPuck,['hollyBerry']:FontAwesomeIcons.hollyBerry,['hooli']:FontAwesomeIcons.hooli,['hornbill']:FontAwesomeIcons.hornbill,['horse']:FontAwesomeIcons.horse,['horseHead']:FontAwesomeIcons.horseHead,['solidHospital']:FontAwesomeIcons.solidHospital,['hospital']:FontAwesomeIcons.hospital,['hospitalUser']:FontAwesomeIcons.hospitalUser,['hotTubPerson']:FontAwesomeIcons.hotTubPerson,['hotdog']:FontAwesomeIcons.hotdog,['hotel']:FontAwesomeIcons.hotel,['hotjar']:FontAwesomeIcons.hotjar,['solidHourglass']:FontAwesomeIcons.solidHourglass,['hourglass']:FontAwesomeIcons.hourglass,['hourglassEnd']:FontAwesomeIcons.hourglassEnd,['solidHourglassHalf']:FontAwesomeIcons.solidHourglassHalf,['hourglassHalf']:FontAwesomeIcons.hourglassHalf,['hourglassStart']:FontAwesomeIcons.hourglassStart,['house']:FontAwesomeIcons.house,['houseChimney']:FontAwesomeIcons.houseChimney,['houseChimneyCrack']:FontAwesomeIcons.houseChimneyCrack,['houseChimneyMedical']:FontAwesomeIcons.houseChimneyMedical,['houseChimneyUser']:FontAwesomeIcons.houseChimneyUser,['houseChimneyWindow']:FontAwesomeIcons.houseChimneyWindow,['houseCircleCheck']:FontAwesomeIcons.houseCircleCheck,['houseCircleExclamation']:FontAwesomeIcons.houseCircleExclamation,['houseCircleXmark']:FontAwesomeIcons.houseCircleXmark,['houseCrack']:FontAwesomeIcons.houseCrack,['houseFire']:FontAwesomeIcons.houseFire,['houseFlag']:FontAwesomeIcons.houseFlag,['houseFloodWater']:FontAwesomeIcons.houseFloodWater,['houseFloodWaterCircleArrowRight']:FontAwesomeIcons.houseFloodWaterCircleArrowRight,['houseLaptop']:FontAwesomeIcons.houseLaptop,['houseLock']:FontAwesomeIcons.houseLock,['houseMedical']:FontAwesomeIcons.houseMedical,['houseMedicalCircleCheck']:FontAwesomeIcons.houseMedicalCircleCheck,['houseMedicalCircleExclamation']:FontAwesomeIcons.houseMedicalCircleExclamation,['houseMedicalCircleXmark']:FontAwesomeIcons.houseMedicalCircleXmark,['houseMedicalFlag']:FontAwesomeIcons.houseMedicalFlag,['houseSignal']:FontAwesomeIcons.houseSignal,['houseTsunami']:FontAwesomeIcons.houseTsunami,['houseUser']:FontAwesomeIcons.houseUser,['houzz']:FontAwesomeIcons.houzz,['hryvniaSign']:FontAwesomeIcons.hryvniaSign,['html5']:FontAwesomeIcons.html5,['hubspot']:FontAwesomeIcons.hubspot,['hurricane']:FontAwesomeIcons.hurricane,['i']:FontAwesomeIcons.i,['iCursor']:FontAwesomeIcons.iCursor,['iceCream']:FontAwesomeIcons.iceCream,['icicles']:FontAwesomeIcons.icicles,['icons']:FontAwesomeIcons.icons,['solidIdBadge']:FontAwesomeIcons.solidIdBadge,['idBadge']:FontAwesomeIcons.idBadge,['solidIdCard']:FontAwesomeIcons.solidIdCard,['idCard']:FontAwesomeIcons.idCard,['idCardClip']:FontAwesomeIcons.idCardClip,['ideal']:FontAwesomeIcons.ideal,['igloo']:FontAwesomeIcons.igloo,['solidImage']:FontAwesomeIcons.solidImage,['image']:FontAwesomeIcons.image,['imagePortrait']:FontAwesomeIcons.imagePortrait,['solidImages']:FontAwesomeIcons.solidImages,['images']:FontAwesomeIcons.images,['imdb']:FontAwesomeIcons.imdb,['inbox']:FontAwesomeIcons.inbox,['indent']:FontAwesomeIcons.indent,['indianRupeeSign']:FontAwesomeIcons.indianRupeeSign,['industry']:FontAwesomeIcons.industry,['infinity']:FontAwesomeIcons.infinity,['info']:FontAwesomeIcons.info,['instagram']:FontAwesomeIcons.instagram,['instalod']:FontAwesomeIcons.instalod,['intercom']:FontAwesomeIcons.intercom,['internetExplorer']:FontAwesomeIcons.internetExplorer,['invision']:FontAwesomeIcons.invision,['ioxhost']:FontAwesomeIcons.ioxhost,['italic']:FontAwesomeIcons.italic,['itchIo']:FontAwesomeIcons.itchIo,['itunes']:FontAwesomeIcons.itunes,['itunesNote']:FontAwesomeIcons.itunesNote,['j']:FontAwesomeIcons.j,['jar']:FontAwesomeIcons.jar,['jarWheat']:FontAwesomeIcons.jarWheat,['java']:FontAwesomeIcons.java,['jedi']:FontAwesomeIcons.jedi,['jediOrder']:FontAwesomeIcons.jediOrder,['jenkins']:FontAwesomeIcons.jenkins,['jetFighter']:FontAwesomeIcons.jetFighter,['jetFighterUp']:FontAwesomeIcons.jetFighterUp,['jira']:FontAwesomeIcons.jira,['joget']:FontAwesomeIcons.joget,['joint']:FontAwesomeIcons.joint,['joomla']:FontAwesomeIcons.joomla,['js']:FontAwesomeIcons.js,['jsfiddle']:FontAwesomeIcons.jsfiddle,['jugDetergent']:FontAwesomeIcons.jugDetergent,['k']:FontAwesomeIcons.k,['kaaba']:FontAwesomeIcons.kaaba,['kaggle']:FontAwesomeIcons.kaggle,['key']:FontAwesomeIcons.key,['keybase']:FontAwesomeIcons.keybase,['solidKeyboard']:FontAwesomeIcons.solidKeyboard,['keyboard']:FontAwesomeIcons.keyboard,['keycdn']:FontAwesomeIcons.keycdn,['khanda']:FontAwesomeIcons.khanda,['kickstarter']:FontAwesomeIcons.kickstarter,['kickstarterK']:FontAwesomeIcons.kickstarterK,['kipSign']:FontAwesomeIcons.kipSign,['kitMedical']:FontAwesomeIcons.kitMedical,['kitchenSet']:FontAwesomeIcons.kitchenSet,['kiwiBird']:FontAwesomeIcons.kiwiBird,['korvue']:FontAwesomeIcons.korvue,['l']:FontAwesomeIcons.l,['landMineOn']:FontAwesomeIcons.landMineOn,['landmark']:FontAwesomeIcons.landmark,['landmarkDome']:FontAwesomeIcons.landmarkDome,['landmarkFlag']:FontAwesomeIcons.landmarkFlag,['language']:FontAwesomeIcons.language,['laptop']:FontAwesomeIcons.laptop,['laptopCode']:FontAwesomeIcons.laptopCode,['laptopFile']:FontAwesomeIcons.laptopFile,['laptopMedical']:FontAwesomeIcons.laptopMedical,['laravel']:FontAwesomeIcons.laravel,['lariSign']:FontAwesomeIcons.lariSign,['lastfm']:FontAwesomeIcons.lastfm,['layerGroup']:FontAwesomeIcons.layerGroup,['leaf']:FontAwesomeIcons.leaf,['leanpub']:FontAwesomeIcons.leanpub,['leftLong']:FontAwesomeIcons.leftLong,['leftRight']:FontAwesomeIcons.leftRight,['solidLemon']:FontAwesomeIcons.solidLemon,['lemon']:FontAwesomeIcons.lemon,['less']:FontAwesomeIcons.less,['lessThan']:FontAwesomeIcons.lessThan,['lessThanEqual']:FontAwesomeIcons.lessThanEqual,['solidLifeRing']:FontAwesomeIcons.solidLifeRing,['lifeRing']:FontAwesomeIcons.lifeRing,['solidLightbulb']:FontAwesomeIcons.solidLightbulb,['lightbulb']:FontAwesomeIcons.lightbulb,['line']:FontAwesomeIcons.line,['linesLeaning']:FontAwesomeIcons.linesLeaning,['link']:FontAwesomeIcons.link,['linkSlash']:FontAwesomeIcons.linkSlash,['linkedin']:FontAwesomeIcons.linkedin,['linkedinIn']:FontAwesomeIcons.linkedinIn,['linode']:FontAwesomeIcons.linode,['linux']:FontAwesomeIcons.linux,['liraSign']:FontAwesomeIcons.liraSign,['list']:FontAwesomeIcons.list,['listCheck']:FontAwesomeIcons.listCheck,['listOl']:FontAwesomeIcons.listOl,['listUl']:FontAwesomeIcons.listUl,['litecoinSign']:FontAwesomeIcons.litecoinSign,['locationArrow']:FontAwesomeIcons.locationArrow,['locationCrosshairs']:FontAwesomeIcons.locationCrosshairs,['locationDot']:FontAwesomeIcons.locationDot,['locationPin']:FontAwesomeIcons.locationPin,['locationPinLock']:FontAwesomeIcons.locationPinLock,['lock']:FontAwesomeIcons.lock,['lockOpen']:FontAwesomeIcons.lockOpen,['locust']:FontAwesomeIcons.locust,['lungs']:FontAwesomeIcons.lungs,['lungsVirus']:FontAwesomeIcons.lungsVirus,['lyft']:FontAwesomeIcons.lyft,['m']:FontAwesomeIcons.m,['magento']:FontAwesomeIcons.magento,['magnet']:FontAwesomeIcons.magnet,['magnifyingGlass']:FontAwesomeIcons.magnifyingGlass,['magnifyingGlassArrowRight']:FontAwesomeIcons.magnifyingGlassArrowRight,['magnifyingGlassChart']:FontAwesomeIcons.magnifyingGlassChart,['magnifyingGlassDollar']:FontAwesomeIcons.magnifyingGlassDollar,['magnifyingGlassLocation']:FontAwesomeIcons.magnifyingGlassLocation,['magnifyingGlassMinus']:FontAwesomeIcons.magnifyingGlassMinus,['magnifyingGlassPlus']:FontAwesomeIcons.magnifyingGlassPlus,['mailchimp']:FontAwesomeIcons.mailchimp,['manatSign']:FontAwesomeIcons.manatSign,['mandalorian']:FontAwesomeIcons.mandalorian,['solidMap']:FontAwesomeIcons.solidMap,['map']:FontAwesomeIcons.map,['mapLocation']:FontAwesomeIcons.mapLocation,['mapLocationDot']:FontAwesomeIcons.mapLocationDot,['mapPin']:FontAwesomeIcons.mapPin,['markdown']:FontAwesomeIcons.markdown,['marker']:FontAwesomeIcons.marker,['mars']:FontAwesomeIcons.mars,['marsAndVenus']:FontAwesomeIcons.marsAndVenus,['marsAndVenusBurst']:FontAwesomeIcons.marsAndVenusBurst,['marsDouble']:FontAwesomeIcons.marsDouble,['marsStroke']:FontAwesomeIcons.marsStroke,['marsStrokeRight']:FontAwesomeIcons.marsStrokeRight,['marsStrokeUp']:FontAwesomeIcons.marsStrokeUp,['martiniGlass']:FontAwesomeIcons.martiniGlass,['martiniGlassCitrus']:FontAwesomeIcons.martiniGlassCitrus,['martiniGlassEmpty']:FontAwesomeIcons.martiniGlassEmpty,['mask']:FontAwesomeIcons.mask,['maskFace']:FontAwesomeIcons.maskFace,['maskVentilator']:FontAwesomeIcons.maskVentilator,['masksTheater']:FontAwesomeIcons.masksTheater,['mastodon']:FontAwesomeIcons.mastodon,['mattressPillow']:FontAwesomeIcons.mattressPillow,['maxcdn']:FontAwesomeIcons.maxcdn,['maximize']:FontAwesomeIcons.maximize,['mdb']:FontAwesomeIcons.mdb,['medal']:FontAwesomeIcons.medal,['medapps']:FontAwesomeIcons.medapps,['medium']:FontAwesomeIcons.medium,['medrt']:FontAwesomeIcons.medrt,['meetup']:FontAwesomeIcons.meetup,['megaport']:FontAwesomeIcons.megaport,['memory']:FontAwesomeIcons.memory,['mendeley']:FontAwesomeIcons.mendeley,['menorah']:FontAwesomeIcons.menorah,['mercury']:FontAwesomeIcons.mercury,['solidMessage']:FontAwesomeIcons.solidMessage,['message']:FontAwesomeIcons.message,['meta']:FontAwesomeIcons.meta,['meteor']:FontAwesomeIcons.meteor,['microblog']:FontAwesomeIcons.microblog,['microchip']:FontAwesomeIcons.microchip,['microphone']:FontAwesomeIcons.microphone,['microphoneLines']:FontAwesomeIcons.microphoneLines,['microphoneLinesSlash']:FontAwesomeIcons.microphoneLinesSlash,['microphoneSlash']:FontAwesomeIcons.microphoneSlash,['microscope']:FontAwesomeIcons.microscope,['microsoft']:FontAwesomeIcons.microsoft,['millSign']:FontAwesomeIcons.millSign,['minimize']:FontAwesomeIcons.minimize,['minus']:FontAwesomeIcons.minus,['mitten']:FontAwesomeIcons.mitten,['mix']:FontAwesomeIcons.mix,['mixcloud']:FontAwesomeIcons.mixcloud,['mixer']:FontAwesomeIcons.mixer,['mizuni']:FontAwesomeIcons.mizuni,['mobile']:FontAwesomeIcons.mobile,['mobileButton']:FontAwesomeIcons.mobileButton,['mobileRetro']:FontAwesomeIcons.mobileRetro,['mobileScreen']:FontAwesomeIcons.mobileScreen,['mobileScreenButton']:FontAwesomeIcons.mobileScreenButton,['modx']:FontAwesomeIcons.modx,['monero']:FontAwesomeIcons.monero,['moneyBill']:FontAwesomeIcons.moneyBill,['solidMoneyBill1']:FontAwesomeIcons.solidMoneyBill1,['moneyBill1']:FontAwesomeIcons.moneyBill1,['moneyBill1Wave']:FontAwesomeIcons.moneyBill1Wave,['moneyBillTransfer']:FontAwesomeIcons.moneyBillTransfer,['moneyBillTrendUp']:FontAwesomeIcons.moneyBillTrendUp,['moneyBillWave']:FontAwesomeIcons.moneyBillWave,['moneyBillWheat']:FontAwesomeIcons.moneyBillWheat,['moneyBills']:FontAwesomeIcons.moneyBills,['moneyCheck']:FontAwesomeIcons.moneyCheck,['moneyCheckDollar']:FontAwesomeIcons.moneyCheckDollar,['monument']:FontAwesomeIcons.monument,['solidMoon']:FontAwesomeIcons.solidMoon,['moon']:FontAwesomeIcons.moon,['mortarPestle']:FontAwesomeIcons.mortarPestle,['mosque']:FontAwesomeIcons.mosque,['mosquito']:FontAwesomeIcons.mosquito,['mosquitoNet']:FontAwesomeIcons.mosquitoNet,['motorcycle']:FontAwesomeIcons.motorcycle,['mound']:FontAwesomeIcons.mound,['mountain']:FontAwesomeIcons.mountain,['mountainCity']:FontAwesomeIcons.mountainCity,['mountainSun']:FontAwesomeIcons.mountainSun,['mugHot']:FontAwesomeIcons.mugHot,['mugSaucer']:FontAwesomeIcons.mugSaucer,['music']:FontAwesomeIcons.music,['n']:FontAwesomeIcons.n,['nairaSign']:FontAwesomeIcons.nairaSign,['napster']:FontAwesomeIcons.napster,['neos']:FontAwesomeIcons.neos,['networkWired']:FontAwesomeIcons.networkWired,['neuter']:FontAwesomeIcons.neuter,['solidNewspaper']:FontAwesomeIcons.solidNewspaper,['newspaper']:FontAwesomeIcons.newspaper,['nfcDirectional']:FontAwesomeIcons.nfcDirectional,['nfcSymbol']:FontAwesomeIcons.nfcSymbol,['nimblr']:FontAwesomeIcons.nimblr,['node']:FontAwesomeIcons.node,['nodeJs']:FontAwesomeIcons.nodeJs,['notEqual']:FontAwesomeIcons.notEqual,['notdef']:FontAwesomeIcons.notdef,['solidNoteSticky']:FontAwesomeIcons.solidNoteSticky,['noteSticky']:FontAwesomeIcons.noteSticky,['notesMedical']:FontAwesomeIcons.notesMedical,['npm']:FontAwesomeIcons.npm,['ns8']:FontAwesomeIcons.ns8,['nutritionix']:FontAwesomeIcons.nutritionix,['o']:FontAwesomeIcons.o,['solidObjectGroup']:FontAwesomeIcons.solidObjectGroup,['objectGroup']:FontAwesomeIcons.objectGroup,['solidObjectUngroup']:FontAwesomeIcons.solidObjectUngroup,['objectUngroup']:FontAwesomeIcons.objectUngroup,['octopusDeploy']:FontAwesomeIcons.octopusDeploy,['odnoklassniki']:FontAwesomeIcons.odnoklassniki,['odysee']:FontAwesomeIcons.odysee,['oilCan']:FontAwesomeIcons.oilCan,['oilWell']:FontAwesomeIcons.oilWell,['oldRepublic']:FontAwesomeIcons.oldRepublic,['om']:FontAwesomeIcons.om,['opencart']:FontAwesomeIcons.opencart,['openid']:FontAwesomeIcons.openid,['opera']:FontAwesomeIcons.opera,['optinMonster']:FontAwesomeIcons.optinMonster,['orcid']:FontAwesomeIcons.orcid,['osi']:FontAwesomeIcons.osi,['otter']:FontAwesomeIcons.otter,['outdent']:FontAwesomeIcons.outdent,['p']:FontAwesomeIcons.p,['padlet']:FontAwesomeIcons.padlet,['page4']:FontAwesomeIcons.page4,['pagelines']:FontAwesomeIcons.pagelines,['pager']:FontAwesomeIcons.pager,['paintRoller']:FontAwesomeIcons.paintRoller,['paintbrush']:FontAwesomeIcons.paintbrush,['palette']:FontAwesomeIcons.palette,['palfed']:FontAwesomeIcons.palfed,['pallet']:FontAwesomeIcons.pallet,['panorama']:FontAwesomeIcons.panorama,['solidPaperPlane']:FontAwesomeIcons.solidPaperPlane,['paperPlane']:FontAwesomeIcons.paperPlane,['paperclip']:FontAwesomeIcons.paperclip,['parachuteBox']:FontAwesomeIcons.parachuteBox,['paragraph']:FontAwesomeIcons.paragraph,['passport']:FontAwesomeIcons.passport,['solidPaste']:FontAwesomeIcons.solidPaste,['paste']:FontAwesomeIcons.paste,['patreon']:FontAwesomeIcons.patreon,['pause']:FontAwesomeIcons.pause,['paw']:FontAwesomeIcons.paw,['paypal']:FontAwesomeIcons.paypal,['peace']:FontAwesomeIcons.peace,['pen']:FontAwesomeIcons.pen,['penClip']:FontAwesomeIcons.penClip,['penFancy']:FontAwesomeIcons.penFancy,['penNib']:FontAwesomeIcons.penNib,['penRuler']:FontAwesomeIcons.penRuler,['solidPenToSquare']:FontAwesomeIcons.solidPenToSquare,['penToSquare']:FontAwesomeIcons.penToSquare,['pencil']:FontAwesomeIcons.pencil,['peopleArrows']:FontAwesomeIcons.peopleArrows,['peopleCarryBox']:FontAwesomeIcons.peopleCarryBox,['peopleGroup']:FontAwesomeIcons.peopleGroup,['peopleLine']:FontAwesomeIcons.peopleLine,['peoplePulling']:FontAwesomeIcons.peoplePulling,['peopleRobbery']:FontAwesomeIcons.peopleRobbery,['peopleRoof']:FontAwesomeIcons.peopleRoof,['pepperHot']:FontAwesomeIcons.pepperHot,['perbyte']:FontAwesomeIcons.perbyte,['percent']:FontAwesomeIcons.percent,['periscope']:FontAwesomeIcons.periscope,['person']:FontAwesomeIcons.person,['personArrowDownToLine']:FontAwesomeIcons.personArrowDownToLine,['personArrowUpFromLine']:FontAwesomeIcons.personArrowUpFromLine,['personBiking']:FontAwesomeIcons.personBiking,['personBooth']:FontAwesomeIcons.personBooth,['personBreastfeeding']:FontAwesomeIcons.personBreastfeeding,['personBurst']:FontAwesomeIcons.personBurst,['personCane']:FontAwesomeIcons.personCane,['personChalkboard']:FontAwesomeIcons.personChalkboard,['personCircleCheck']:FontAwesomeIcons.personCircleCheck,['personCircleExclamation']:FontAwesomeIcons.personCircleExclamation,['personCircleMinus']:FontAwesomeIcons.personCircleMinus,['personCirclePlus']:FontAwesomeIcons.personCirclePlus,['personCircleQuestion']:FontAwesomeIcons.personCircleQuestion,['personCircleXmark']:FontAwesomeIcons.personCircleXmark,['personDigging']:FontAwesomeIcons.personDigging,['personDotsFromLine']:FontAwesomeIcons.personDotsFromLine,['personDress']:FontAwesomeIcons.personDress,['personDressBurst']:FontAwesomeIcons.personDressBurst,['personDrowning']:FontAwesomeIcons.personDrowning,['personFalling']:FontAwesomeIcons.personFalling,['personFallingBurst']:FontAwesomeIcons.personFallingBurst,['personHalfDress']:FontAwesomeIcons.personHalfDress,['personHarassing']:FontAwesomeIcons.personHarassing,['personHiking']:FontAwesomeIcons.personHiking,['personMilitaryPointing']:FontAwesomeIcons.personMilitaryPointing,['personMilitaryRifle']:FontAwesomeIcons.personMilitaryRifle,['personMilitaryToPerson']:FontAwesomeIcons.personMilitaryToPerson,['personPraying']:FontAwesomeIcons.personPraying,['personPregnant']:FontAwesomeIcons.personPregnant,['personRays']:FontAwesomeIcons.personRays,['personRifle']:FontAwesomeIcons.personRifle,['personRunning']:FontAwesomeIcons.personRunning,['personShelter']:FontAwesomeIcons.personShelter,['personSkating']:FontAwesomeIcons.personSkating,['personSkiing']:FontAwesomeIcons.personSkiing,['personSkiingNordic']:FontAwesomeIcons.personSkiingNordic,['personSnowboarding']:FontAwesomeIcons.personSnowboarding,['personSwimming']:FontAwesomeIcons.personSwimming,['personThroughWindow']:FontAwesomeIcons.personThroughWindow,['personWalking']:FontAwesomeIcons.personWalking,['personWalkingArrowLoopLeft']:FontAwesomeIcons.personWalkingArrowLoopLeft,['personWalkingArrowRight']:FontAwesomeIcons.personWalkingArrowRight,['personWalkingDashedLineArrowRight']:FontAwesomeIcons.personWalkingDashedLineArrowRight,['personWalkingLuggage']:FontAwesomeIcons.personWalkingLuggage,['personWalkingWithCane']:FontAwesomeIcons.personWalkingWithCane,['pesetaSign']:FontAwesomeIcons.pesetaSign,['pesoSign']:FontAwesomeIcons.pesoSign,['phabricator']:FontAwesomeIcons.phabricator,['phoenixFramework']:FontAwesomeIcons.phoenixFramework,['phoenixSquadron']:FontAwesomeIcons.phoenixSquadron,['phone']:FontAwesomeIcons.phone,['phoneFlip']:FontAwesomeIcons.phoneFlip,['phoneSlash']:FontAwesomeIcons.phoneSlash,['phoneVolume']:FontAwesomeIcons.phoneVolume,['photoFilm']:FontAwesomeIcons.photoFilm,['php']:FontAwesomeIcons.php,['piedPiper']:FontAwesomeIcons.piedPiper,['piedPiperAlt']:FontAwesomeIcons.piedPiperAlt,['piedPiperHat']:FontAwesomeIcons.piedPiperHat,['piedPiperPp']:FontAwesomeIcons.piedPiperPp,['piggyBank']:FontAwesomeIcons.piggyBank,['pills']:FontAwesomeIcons.pills,['pinterest']:FontAwesomeIcons.pinterest,['pinterestP']:FontAwesomeIcons.pinterestP,['pix']:FontAwesomeIcons.pix,['pizzaSlice']:FontAwesomeIcons.pizzaSlice,['placeOfWorship']:FontAwesomeIcons.placeOfWorship,['plane']:FontAwesomeIcons.plane,['planeArrival']:FontAwesomeIcons.planeArrival,['planeCircleCheck']:FontAwesomeIcons.planeCircleCheck,['planeCircleExclamation']:FontAwesomeIcons.planeCircleExclamation,['planeCircleXmark']:FontAwesomeIcons.planeCircleXmark,['planeDeparture']:FontAwesomeIcons.planeDeparture,['planeLock']:FontAwesomeIcons.planeLock,['planeSlash']:FontAwesomeIcons.planeSlash,['planeUp']:FontAwesomeIcons.planeUp,['plantWilt']:FontAwesomeIcons.plantWilt,['plateWheat']:FontAwesomeIcons.plateWheat,['play']:FontAwesomeIcons.play,['playstation']:FontAwesomeIcons.playstation,['plug']:FontAwesomeIcons.plug,['plugCircleBolt']:FontAwesomeIcons.plugCircleBolt,['plugCircleCheck']:FontAwesomeIcons.plugCircleCheck,['plugCircleExclamation']:FontAwesomeIcons.plugCircleExclamation,['plugCircleMinus']:FontAwesomeIcons.plugCircleMinus,['plugCirclePlus']:FontAwesomeIcons.plugCirclePlus,['plugCircleXmark']:FontAwesomeIcons.plugCircleXmark,['plus']:FontAwesomeIcons.plus,['plusMinus']:FontAwesomeIcons.plusMinus,['podcast']:FontAwesomeIcons.podcast,['poo']:FontAwesomeIcons.poo,['pooStorm']:FontAwesomeIcons.pooStorm,['poop']:FontAwesomeIcons.poop,['powerOff']:FontAwesomeIcons.powerOff,['prescription']:FontAwesomeIcons.prescription,['prescriptionBottle']:FontAwesomeIcons.prescriptionBottle,['prescriptionBottleMedical']:FontAwesomeIcons.prescriptionBottleMedical,['print']:FontAwesomeIcons.print,['productHunt']:FontAwesomeIcons.productHunt,['pumpMedical']:FontAwesomeIcons.pumpMedical,['pumpSoap']:FontAwesomeIcons.pumpSoap,['pushed']:FontAwesomeIcons.pushed,['puzzlePiece']:FontAwesomeIcons.puzzlePiece,['python']:FontAwesomeIcons.python,['q']:FontAwesomeIcons.q,['qq']:FontAwesomeIcons.qq,['qrcode']:FontAwesomeIcons.qrcode,['question']:FontAwesomeIcons.question,['quinscape']:FontAwesomeIcons.quinscape,['quora']:FontAwesomeIcons.quora,['quoteLeft']:FontAwesomeIcons.quoteLeft,['quoteRight']:FontAwesomeIcons.quoteRight,['r']:FontAwesomeIcons.r,['rProject']:FontAwesomeIcons.rProject,['radiation']:FontAwesomeIcons.radiation,['radio']:FontAwesomeIcons.radio,['rainbow']:FontAwesomeIcons.rainbow,['rankingStar']:FontAwesomeIcons.rankingStar,['raspberryPi']:FontAwesomeIcons.raspberryPi,['ravelry']:FontAwesomeIcons.ravelry,['react']:FontAwesomeIcons.react,['reacteurope']:FontAwesomeIcons.reacteurope,['readme']:FontAwesomeIcons.readme,['rebel']:FontAwesomeIcons.rebel,['receipt']:FontAwesomeIcons.receipt,['recordVinyl']:FontAwesomeIcons.recordVinyl,['rectangleAd']:FontAwesomeIcons.rectangleAd,['solidRectangleList']:FontAwesomeIcons.solidRectangleList,['rectangleList']:FontAwesomeIcons.rectangleList,['solidRectangleXmark']:FontAwesomeIcons.solidRectangleXmark,['rectangleXmark']:FontAwesomeIcons.rectangleXmark,['recycle']:FontAwesomeIcons.recycle,['redRiver']:FontAwesomeIcons.redRiver,['reddit']:FontAwesomeIcons.reddit,['redditAlien']:FontAwesomeIcons.redditAlien,['redhat']:FontAwesomeIcons.redhat,['solidRegistered']:FontAwesomeIcons.solidRegistered,['registered']:FontAwesomeIcons.registered,['renren']:FontAwesomeIcons.renren,['repeat']:FontAwesomeIcons.repeat,['reply']:FontAwesomeIcons.reply,['replyAll']:FontAwesomeIcons.replyAll,['replyd']:FontAwesomeIcons.replyd,['republican']:FontAwesomeIcons.republican,['researchgate']:FontAwesomeIcons.researchgate,['resolving']:FontAwesomeIcons.resolving,['restroom']:FontAwesomeIcons.restroom,['retweet']:FontAwesomeIcons.retweet,['rev']:FontAwesomeIcons.rev,['ribbon']:FontAwesomeIcons.ribbon,['rightFromBracket']:FontAwesomeIcons.rightFromBracket,['rightLeft']:FontAwesomeIcons.rightLeft,['rightLong']:FontAwesomeIcons.rightLong,['rightToBracket']:FontAwesomeIcons.rightToBracket,['ring']:FontAwesomeIcons.ring,['road']:FontAwesomeIcons.road,['roadBarrier']:FontAwesomeIcons.roadBarrier,['roadBridge']:FontAwesomeIcons.roadBridge,['roadCircleCheck']:FontAwesomeIcons.roadCircleCheck,['roadCircleExclamation']:FontAwesomeIcons.roadCircleExclamation,['roadCircleXmark']:FontAwesomeIcons.roadCircleXmark,['roadLock']:FontAwesomeIcons.roadLock,['roadSpikes']:FontAwesomeIcons.roadSpikes,['robot']:FontAwesomeIcons.robot,['rocket']:FontAwesomeIcons.rocket,['rocketchat']:FontAwesomeIcons.rocketchat,['rockrms']:FontAwesomeIcons.rockrms,['rotate']:FontAwesomeIcons.rotate,['rotateLeft']:FontAwesomeIcons.rotateLeft,['rotateRight']:FontAwesomeIcons.rotateRight,['route']:FontAwesomeIcons.route,['rss']:FontAwesomeIcons.rss,['rubleSign']:FontAwesomeIcons.rubleSign,['rug']:FontAwesomeIcons.rug,['ruler']:FontAwesomeIcons.ruler,['rulerCombined']:FontAwesomeIcons.rulerCombined,['rulerHorizontal']:FontAwesomeIcons.rulerHorizontal,['rulerVertical']:FontAwesomeIcons.rulerVertical,['rupeeSign']:FontAwesomeIcons.rupeeSign,['rupiahSign']:FontAwesomeIcons.rupiahSign,['rust']:FontAwesomeIcons.rust,['s']:FontAwesomeIcons.s,['sackDollar']:FontAwesomeIcons.sackDollar,['sackXmark']:FontAwesomeIcons.sackXmark,['safari']:FontAwesomeIcons.safari,['sailboat']:FontAwesomeIcons.sailboat,['salesforce']:FontAwesomeIcons.salesforce,['sass']:FontAwesomeIcons.sass,['satellite']:FontAwesomeIcons.satellite,['satelliteDish']:FontAwesomeIcons.satelliteDish,['scaleBalanced']:FontAwesomeIcons.scaleBalanced,['scaleUnbalanced']:FontAwesomeIcons.scaleUnbalanced,['scaleUnbalancedFlip']:FontAwesomeIcons.scaleUnbalancedFlip,['schlix']:FontAwesomeIcons.schlix,['school']:FontAwesomeIcons.school,['schoolCircleCheck']:FontAwesomeIcons.schoolCircleCheck,['schoolCircleExclamation']:FontAwesomeIcons.schoolCircleExclamation,['schoolCircleXmark']:FontAwesomeIcons.schoolCircleXmark,['schoolFlag']:FontAwesomeIcons.schoolFlag,['schoolLock']:FontAwesomeIcons.schoolLock,['scissors']:FontAwesomeIcons.scissors,['screenpal']:FontAwesomeIcons.screenpal,['screwdriver']:FontAwesomeIcons.screwdriver,['screwdriverWrench']:FontAwesomeIcons.screwdriverWrench,['scribd']:FontAwesomeIcons.scribd,['scroll']:FontAwesomeIcons.scroll,['scrollTorah']:FontAwesomeIcons.scrollTorah,['sdCard']:FontAwesomeIcons.sdCard,['searchengin']:FontAwesomeIcons.searchengin,['section']:FontAwesomeIcons.section,['seedling']:FontAwesomeIcons.seedling,['sellcast']:FontAwesomeIcons.sellcast,['sellsy']:FontAwesomeIcons.sellsy,['server']:FontAwesomeIcons.server,['servicestack']:FontAwesomeIcons.servicestack,['shapes']:FontAwesomeIcons.shapes,['share']:FontAwesomeIcons.share,['solidShareFromSquare']:FontAwesomeIcons.solidShareFromSquare,['shareFromSquare']:FontAwesomeIcons.shareFromSquare,['shareNodes']:FontAwesomeIcons.shareNodes,['sheetPlastic']:FontAwesomeIcons.sheetPlastic,['shekelSign']:FontAwesomeIcons.shekelSign,['shield']:FontAwesomeIcons.shield,['shieldCat']:FontAwesomeIcons.shieldCat,['shieldDog']:FontAwesomeIcons.shieldDog,['shieldHalved']:FontAwesomeIcons.shieldHalved,['shieldHeart']:FontAwesomeIcons.shieldHeart,['shieldVirus']:FontAwesomeIcons.shieldVirus,['ship']:FontAwesomeIcons.ship,['shirt']:FontAwesomeIcons.shirt,['shirtsinbulk']:FontAwesomeIcons.shirtsinbulk,['shoePrints']:FontAwesomeIcons.shoePrints,['shop']:FontAwesomeIcons.shop,['shopLock']:FontAwesomeIcons.shopLock,['shopSlash']:FontAwesomeIcons.shopSlash,['shopify']:FontAwesomeIcons.shopify,['shopware']:FontAwesomeIcons.shopware,['shower']:FontAwesomeIcons.shower,['shrimp']:FontAwesomeIcons.shrimp,['shuffle']:FontAwesomeIcons.shuffle,['shuttleSpace']:FontAwesomeIcons.shuttleSpace,['signHanging']:FontAwesomeIcons.signHanging,['signal']:FontAwesomeIcons.signal,['signature']:FontAwesomeIcons.signature,['signsPost']:FontAwesomeIcons.signsPost,['simCard']:FontAwesomeIcons.simCard,['simplybuilt']:FontAwesomeIcons.simplybuilt,['sink']:FontAwesomeIcons.sink,['sistrix']:FontAwesomeIcons.sistrix,['sitemap']:FontAwesomeIcons.sitemap,['sith']:FontAwesomeIcons.sith,['sitrox']:FontAwesomeIcons.sitrox,['sketch']:FontAwesomeIcons.sketch,['skull']:FontAwesomeIcons.skull,['skullCrossbones']:FontAwesomeIcons.skullCrossbones,['skyatlas']:FontAwesomeIcons.skyatlas,['skype']:FontAwesomeIcons.skype,['slack']:FontAwesomeIcons.slack,['slash']:FontAwesomeIcons.slash,['sleigh']:FontAwesomeIcons.sleigh,['sliders']:FontAwesomeIcons.sliders,['slideshare']:FontAwesomeIcons.slideshare,['smog']:FontAwesomeIcons.smog,['smoking']:FontAwesomeIcons.smoking,['snapchat']:FontAwesomeIcons.snapchat,['solidSnowflake']:FontAwesomeIcons.solidSnowflake,['snowflake']:FontAwesomeIcons.snowflake,['snowman']:FontAwesomeIcons.snowman,['snowplow']:FontAwesomeIcons.snowplow,['soap']:FontAwesomeIcons.soap,['socks']:FontAwesomeIcons.socks,['solarPanel']:FontAwesomeIcons.solarPanel,['sort']:FontAwesomeIcons.sort,['sortDown']:FontAwesomeIcons.sortDown,['sortUp']:FontAwesomeIcons.sortUp,['soundcloud']:FontAwesomeIcons.soundcloud,['sourcetree']:FontAwesomeIcons.sourcetree,['spa']:FontAwesomeIcons.spa,['spaceAwesome']:FontAwesomeIcons.spaceAwesome,['spaghettiMonsterFlying']:FontAwesomeIcons.spaghettiMonsterFlying,['speakap']:FontAwesomeIcons.speakap,['speakerDeck']:FontAwesomeIcons.speakerDeck,['spellCheck']:FontAwesomeIcons.spellCheck,['spider']:FontAwesomeIcons.spider,['spinner']:FontAwesomeIcons.spinner,['splotch']:FontAwesomeIcons.splotch,['spoon']:FontAwesomeIcons.spoon,['spotify']:FontAwesomeIcons.spotify,['sprayCan']:FontAwesomeIcons.sprayCan,['sprayCanSparkles']:FontAwesomeIcons.sprayCanSparkles,['solidSquare']:FontAwesomeIcons.solidSquare,['square']:FontAwesomeIcons.square,['squareArrowUpRight']:FontAwesomeIcons.squareArrowUpRight,['squareBehance']:FontAwesomeIcons.squareBehance,['solidSquareCaretDown']:FontAwesomeIcons.solidSquareCaretDown,['squareCaretDown']:FontAwesomeIcons.squareCaretDown,['solidSquareCaretLeft']:FontAwesomeIcons.solidSquareCaretLeft,['squareCaretLeft']:FontAwesomeIcons.squareCaretLeft,['solidSquareCaretRight']:FontAwesomeIcons.solidSquareCaretRight,['squareCaretRight']:FontAwesomeIcons.squareCaretRight,['solidSquareCaretUp']:FontAwesomeIcons.solidSquareCaretUp,['squareCaretUp']:FontAwesomeIcons.squareCaretUp,['solidSquareCheck']:FontAwesomeIcons.solidSquareCheck,['squareCheck']:FontAwesomeIcons.squareCheck,['squareDribbble']:FontAwesomeIcons.squareDribbble,['squareEnvelope']:FontAwesomeIcons.squareEnvelope,['squareFacebook']:FontAwesomeIcons.squareFacebook,['squareFontAwesome']:FontAwesomeIcons.squareFontAwesome,['squareFontAwesomeStroke']:FontAwesomeIcons.squareFontAwesomeStroke,['solidSquareFull']:FontAwesomeIcons.solidSquareFull,['squareFull']:FontAwesomeIcons.squareFull,['squareGit']:FontAwesomeIcons.squareGit,['squareGithub']:FontAwesomeIcons.squareGithub,['squareGitlab']:FontAwesomeIcons.squareGitlab,['squareGooglePlus']:FontAwesomeIcons.squareGooglePlus,['squareH']:FontAwesomeIcons.squareH,['squareHackerNews']:FontAwesomeIcons.squareHackerNews,['squareInstagram']:FontAwesomeIcons.squareInstagram,['squareJs']:FontAwesomeIcons.squareJs,['squareLastfm']:FontAwesomeIcons.squareLastfm,['solidSquareMinus']:FontAwesomeIcons.solidSquareMinus,['squareMinus']:FontAwesomeIcons.squareMinus,['squareNfi']:FontAwesomeIcons.squareNfi,['squareOdnoklassniki']:FontAwesomeIcons.squareOdnoklassniki,['squareParking']:FontAwesomeIcons.squareParking,['squarePen']:FontAwesomeIcons.squarePen,['squarePersonConfined']:FontAwesomeIcons.squarePersonConfined,['squarePhone']:FontAwesomeIcons.squarePhone,['squarePhoneFlip']:FontAwesomeIcons.squarePhoneFlip,['squarePiedPiper']:FontAwesomeIcons.squarePiedPiper,['squarePinterest']:FontAwesomeIcons.squarePinterest,['solidSquarePlus']:FontAwesomeIcons.solidSquarePlus,['squarePlus']:FontAwesomeIcons.squarePlus,['squarePollHorizontal']:FontAwesomeIcons.squarePollHorizontal,['squarePollVertical']:FontAwesomeIcons.squarePollVertical,['squareReddit']:FontAwesomeIcons.squareReddit,['squareRootVariable']:FontAwesomeIcons.squareRootVariable,['squareRss']:FontAwesomeIcons.squareRss,['squareShareNodes']:FontAwesomeIcons.squareShareNodes,['squareSnapchat']:FontAwesomeIcons.squareSnapchat,['squareSteam']:FontAwesomeIcons.squareSteam,['squareTumblr']:FontAwesomeIcons.squareTumblr,['squareTwitter']:FontAwesomeIcons.squareTwitter,['squareUpRight']:FontAwesomeIcons.squareUpRight,['squareViadeo']:FontAwesomeIcons.squareViadeo,['squareVimeo']:FontAwesomeIcons.squareVimeo,['squareVirus']:FontAwesomeIcons.squareVirus,['squareWhatsapp']:FontAwesomeIcons.squareWhatsapp,['squareXing']:FontAwesomeIcons.squareXing,['squareXmark']:FontAwesomeIcons.squareXmark,['squareYoutube']:FontAwesomeIcons.squareYoutube,['squarespace']:FontAwesomeIcons.squarespace,['stackExchange']:FontAwesomeIcons.stackExchange,['stackOverflow']:FontAwesomeIcons.stackOverflow,['stackpath']:FontAwesomeIcons.stackpath,['staffSnake']:FontAwesomeIcons.staffSnake,['stairs']:FontAwesomeIcons.stairs,['stamp']:FontAwesomeIcons.stamp,['stapler']:FontAwesomeIcons.stapler,['solidStar']:FontAwesomeIcons.solidStar,['star']:FontAwesomeIcons.star,['starAndCrescent']:FontAwesomeIcons.starAndCrescent,['solidStarHalf']:FontAwesomeIcons.solidStarHalf,['starHalf']:FontAwesomeIcons.starHalf,['solidStarHalfStroke']:FontAwesomeIcons.solidStarHalfStroke,['starHalfStroke']:FontAwesomeIcons.starHalfStroke,['starOfDavid']:FontAwesomeIcons.starOfDavid,['starOfLife']:FontAwesomeIcons.starOfLife,['staylinked']:FontAwesomeIcons.staylinked,['steam']:FontAwesomeIcons.steam,['steamSymbol']:FontAwesomeIcons.steamSymbol,['sterlingSign']:FontAwesomeIcons.sterlingSign,['stethoscope']:FontAwesomeIcons.stethoscope,['stickerMule']:FontAwesomeIcons.stickerMule,['stop']:FontAwesomeIcons.stop,['stopwatch']:FontAwesomeIcons.stopwatch,['stopwatch20']:FontAwesomeIcons.stopwatch20,['store']:FontAwesomeIcons.store,['storeSlash']:FontAwesomeIcons.storeSlash,['strava']:FontAwesomeIcons.strava,['streetView']:FontAwesomeIcons.streetView,['strikethrough']:FontAwesomeIcons.strikethrough,['stripe']:FontAwesomeIcons.stripe,['stripeS']:FontAwesomeIcons.stripeS,['stroopwafel']:FontAwesomeIcons.stroopwafel,['stubber']:FontAwesomeIcons.stubber,['studiovinari']:FontAwesomeIcons.studiovinari,['stumbleupon']:FontAwesomeIcons.stumbleupon,['stumbleuponCircle']:FontAwesomeIcons.stumbleuponCircle,['subscript']:FontAwesomeIcons.subscript,['suitcase']:FontAwesomeIcons.suitcase,['suitcaseMedical']:FontAwesomeIcons.suitcaseMedical,['suitcaseRolling']:FontAwesomeIcons.suitcaseRolling,['solidSun']:FontAwesomeIcons.solidSun,['sun']:FontAwesomeIcons.sun,['sunPlantWilt']:FontAwesomeIcons.sunPlantWilt,['superpowers']:FontAwesomeIcons.superpowers,['superscript']:FontAwesomeIcons.superscript,['supple']:FontAwesomeIcons.supple,['suse']:FontAwesomeIcons.suse,['swatchbook']:FontAwesomeIcons.swatchbook,['swift']:FontAwesomeIcons.swift,['symfony']:FontAwesomeIcons.symfony,['synagogue']:FontAwesomeIcons.synagogue,['syringe']:FontAwesomeIcons.syringe,['t']:FontAwesomeIcons.t,['table']:FontAwesomeIcons.table,['tableCells']:FontAwesomeIcons.tableCells,['tableCellsLarge']:FontAwesomeIcons.tableCellsLarge,['tableColumns']:FontAwesomeIcons.tableColumns,['tableList']:FontAwesomeIcons.tableList,['tableTennisPaddleBall']:FontAwesomeIcons.tableTennisPaddleBall,['tablet']:FontAwesomeIcons.tablet,['tabletButton']:FontAwesomeIcons.tabletButton,['tabletScreenButton']:FontAwesomeIcons.tabletScreenButton,['tablets']:FontAwesomeIcons.tablets,['tachographDigital']:FontAwesomeIcons.tachographDigital,['tag']:FontAwesomeIcons.tag,['tags']:FontAwesomeIcons.tags,['tape']:FontAwesomeIcons.tape,['tarp']:FontAwesomeIcons.tarp,['tarpDroplet']:FontAwesomeIcons.tarpDroplet,['taxi']:FontAwesomeIcons.taxi,['teamspeak']:FontAwesomeIcons.teamspeak,['teeth']:FontAwesomeIcons.teeth,['teethOpen']:FontAwesomeIcons.teethOpen,['telegram']:FontAwesomeIcons.telegram,['temperatureArrowDown']:FontAwesomeIcons.temperatureArrowDown,['temperatureArrowUp']:FontAwesomeIcons.temperatureArrowUp,['temperatureEmpty']:FontAwesomeIcons.temperatureEmpty,['temperatureFull']:FontAwesomeIcons.temperatureFull,['temperatureHalf']:FontAwesomeIcons.temperatureHalf,['temperatureHigh']:FontAwesomeIcons.temperatureHigh,['temperatureLow']:FontAwesomeIcons.temperatureLow,['temperatureQuarter']:FontAwesomeIcons.temperatureQuarter,['temperatureThreeQuarters']:FontAwesomeIcons.temperatureThreeQuarters,['tencentWeibo']:FontAwesomeIcons.tencentWeibo,['tengeSign']:FontAwesomeIcons.tengeSign,['tent']:FontAwesomeIcons.tent,['tentArrowDownToLine']:FontAwesomeIcons.tentArrowDownToLine,['tentArrowLeftRight']:FontAwesomeIcons.tentArrowLeftRight,['tentArrowTurnLeft']:FontAwesomeIcons.tentArrowTurnLeft,['tentArrowsDown']:FontAwesomeIcons.tentArrowsDown,['tents']:FontAwesomeIcons.tents,['terminal']:FontAwesomeIcons.terminal,['textHeight']:FontAwesomeIcons.textHeight,['textSlash']:FontAwesomeIcons.textSlash,['textWidth']:FontAwesomeIcons.textWidth,['theRedYeti']:FontAwesomeIcons.theRedYeti,['themeco']:FontAwesomeIcons.themeco,['themeisle']:FontAwesomeIcons.themeisle,['thermometer']:FontAwesomeIcons.thermometer,['thinkPeaks']:FontAwesomeIcons.thinkPeaks,['solidThumbsDown']:FontAwesomeIcons.solidThumbsDown,['thumbsDown']:FontAwesomeIcons.thumbsDown,['solidThumbsUp']:FontAwesomeIcons.solidThumbsUp,['thumbsUp']:FontAwesomeIcons.thumbsUp,['thumbtack']:FontAwesomeIcons.thumbtack,['ticket']:FontAwesomeIcons.ticket,['ticketSimple']:FontAwesomeIcons.ticketSimple,['tiktok']:FontAwesomeIcons.tiktok,['timeline']:FontAwesomeIcons.timeline,['toggleOff']:FontAwesomeIcons.toggleOff,['toggleOn']:FontAwesomeIcons.toggleOn,['toilet']:FontAwesomeIcons.toilet,['toiletPaper']:FontAwesomeIcons.toiletPaper,['toiletPaperSlash']:FontAwesomeIcons.toiletPaperSlash,['toiletPortable']:FontAwesomeIcons.toiletPortable,['toiletsPortable']:FontAwesomeIcons.toiletsPortable,['toolbox']:FontAwesomeIcons.toolbox,['tooth']:FontAwesomeIcons.tooth,['toriiGate']:FontAwesomeIcons.toriiGate,['tornado']:FontAwesomeIcons.tornado,['towerBroadcast']:FontAwesomeIcons.towerBroadcast,['towerCell']:FontAwesomeIcons.towerCell,['towerObservation']:FontAwesomeIcons.towerObservation,['tractor']:FontAwesomeIcons.tractor,['tradeFederation']:FontAwesomeIcons.tradeFederation,['trademark']:FontAwesomeIcons.trademark,['trafficLight']:FontAwesomeIcons.trafficLight,['trailer']:FontAwesomeIcons.trailer,['train']:FontAwesomeIcons.train,['trainSubway']:FontAwesomeIcons.trainSubway,['trainTram']:FontAwesomeIcons.trainTram,['transgender']:FontAwesomeIcons.transgender,['trash']:FontAwesomeIcons.trash,['trashArrowUp']:FontAwesomeIcons.trashArrowUp,['solidTrashCan']:FontAwesomeIcons.solidTrashCan,['trashCan']:FontAwesomeIcons.trashCan,['trashCanArrowUp']:FontAwesomeIcons.trashCanArrowUp,['tree']:FontAwesomeIcons.tree,['treeCity']:FontAwesomeIcons.treeCity,['trello']:FontAwesomeIcons.trello,['triangleExclamation']:FontAwesomeIcons.triangleExclamation,['trophy']:FontAwesomeIcons.trophy,['trowel']:FontAwesomeIcons.trowel,['trowelBricks']:FontAwesomeIcons.trowelBricks,['truck']:FontAwesomeIcons.truck,['truckArrowRight']:FontAwesomeIcons.truckArrowRight,['truckDroplet']:FontAwesomeIcons.truckDroplet,['truckFast']:FontAwesomeIcons.truckFast,['truckField']:FontAwesomeIcons.truckField,['truckFieldUn']:FontAwesomeIcons.truckFieldUn,['truckFront']:FontAwesomeIcons.truckFront,['truckMedical']:FontAwesomeIcons.truckMedical,['truckMonster']:FontAwesomeIcons.truckMonster,['truckMoving']:FontAwesomeIcons.truckMoving,['truckPickup']:FontAwesomeIcons.truckPickup,['truckPlane']:FontAwesomeIcons.truckPlane,['truckRampBox']:FontAwesomeIcons.truckRampBox,['tty']:FontAwesomeIcons.tty,['tumblr']:FontAwesomeIcons.tumblr,['turkishLiraSign']:FontAwesomeIcons.turkishLiraSign,['turnDown']:FontAwesomeIcons.turnDown,['turnUp']:FontAwesomeIcons.turnUp,['tv']:FontAwesomeIcons.tv,['twitch']:FontAwesomeIcons.twitch,['twitter']:FontAwesomeIcons.twitter,['typo3']:FontAwesomeIcons.typo3,['u']:FontAwesomeIcons.u,['uber']:FontAwesomeIcons.uber,['ubuntu']:FontAwesomeIcons.ubuntu,['uikit']:FontAwesomeIcons.uikit,['umbraco']:FontAwesomeIcons.umbraco,['umbrella']:FontAwesomeIcons.umbrella,['umbrellaBeach']:FontAwesomeIcons.umbrellaBeach,['uncharted']:FontAwesomeIcons.uncharted,['underline']:FontAwesomeIcons.underline,['uniregistry']:FontAwesomeIcons.uniregistry,['unity']:FontAwesomeIcons.unity,['universalAccess']:FontAwesomeIcons.universalAccess,['unlock']:FontAwesomeIcons.unlock,['unlockKeyhole']:FontAwesomeIcons.unlockKeyhole,['unsplash']:FontAwesomeIcons.unsplash,['untappd']:FontAwesomeIcons.untappd,['upDown']:FontAwesomeIcons.upDown,['upDownLeftRight']:FontAwesomeIcons.upDownLeftRight,['upLong']:FontAwesomeIcons.upLong,['upRightAndDownLeftFromCenter']:FontAwesomeIcons.upRightAndDownLeftFromCenter,['upRightFromSquare']:FontAwesomeIcons.upRightFromSquare,['upload']:FontAwesomeIcons.upload,['ups']:FontAwesomeIcons.ups,['usb']:FontAwesomeIcons.usb,['solidUser']:FontAwesomeIcons.solidUser,['user']:FontAwesomeIcons.user,['userAstronaut']:FontAwesomeIcons.userAstronaut,['userCheck']:FontAwesomeIcons.userCheck,['userClock']:FontAwesomeIcons.userClock,['userDoctor']:FontAwesomeIcons.userDoctor,['userGear']:FontAwesomeIcons.userGear,['userGraduate']:FontAwesomeIcons.userGraduate,['userGroup']:FontAwesomeIcons.userGroup,['userInjured']:FontAwesomeIcons.userInjured,['userLarge']:FontAwesomeIcons.userLarge,['userLargeSlash']:FontAwesomeIcons.userLargeSlash,['userLock']:FontAwesomeIcons.userLock,['userMinus']:FontAwesomeIcons.userMinus,['userNinja']:FontAwesomeIcons.userNinja,['userNurse']:FontAwesomeIcons.userNurse,['userPen']:FontAwesomeIcons.userPen,['userPlus']:FontAwesomeIcons.userPlus,['userSecret']:FontAwesomeIcons.userSecret,['userShield']:FontAwesomeIcons.userShield,['userSlash']:FontAwesomeIcons.userSlash,['userTag']:FontAwesomeIcons.userTag,['userTie']:FontAwesomeIcons.userTie,['userXmark']:FontAwesomeIcons.userXmark,['users']:FontAwesomeIcons.users,['usersBetweenLines']:FontAwesomeIcons.usersBetweenLines,['usersGear']:FontAwesomeIcons.usersGear,['usersLine']:FontAwesomeIcons.usersLine,['usersRays']:FontAwesomeIcons.usersRays,['usersRectangle']:FontAwesomeIcons.usersRectangle,['usersSlash']:FontAwesomeIcons.usersSlash,['usersViewfinder']:FontAwesomeIcons.usersViewfinder,['usps']:FontAwesomeIcons.usps,['ussunnah']:FontAwesomeIcons.ussunnah,['utensils']:FontAwesomeIcons.utensils,['v']:FontAwesomeIcons.v,['vaadin']:FontAwesomeIcons.vaadin,['vanShuttle']:FontAwesomeIcons.vanShuttle,['vault']:FontAwesomeIcons.vault,['vectorSquare']:FontAwesomeIcons.vectorSquare,['venus']:FontAwesomeIcons.venus,['venusDouble']:FontAwesomeIcons.venusDouble,['venusMars']:FontAwesomeIcons.venusMars,['vest']:FontAwesomeIcons.vest,['vestPatches']:FontAwesomeIcons.vestPatches,['viacoin']:FontAwesomeIcons.viacoin,['viadeo']:FontAwesomeIcons.viadeo,['vial']:FontAwesomeIcons.vial,['vialCircleCheck']:FontAwesomeIcons.vialCircleCheck,['vialVirus']:FontAwesomeIcons.vialVirus,['vials']:FontAwesomeIcons.vials,['viber']:FontAwesomeIcons.viber,['video']:FontAwesomeIcons.video,['videoSlash']:FontAwesomeIcons.videoSlash,['vihara']:FontAwesomeIcons.vihara,['vimeo']:FontAwesomeIcons.vimeo,['vimeoV']:FontAwesomeIcons.vimeoV,['vine']:FontAwesomeIcons.vine,['virus']:FontAwesomeIcons.virus,['virusCovid']:FontAwesomeIcons.virusCovid,['virusCovidSlash']:FontAwesomeIcons.virusCovidSlash,['virusSlash']:FontAwesomeIcons.virusSlash,['viruses']:FontAwesomeIcons.viruses,['vk']:FontAwesomeIcons.vk,['vnv']:FontAwesomeIcons.vnv,['voicemail']:FontAwesomeIcons.voicemail,['volcano']:FontAwesomeIcons.volcano,['volleyball']:FontAwesomeIcons.volleyball,['volumeHigh']:FontAwesomeIcons.volumeHigh,['volumeLow']:FontAwesomeIcons.volumeLow,['volumeOff']:FontAwesomeIcons.volumeOff,['volumeXmark']:FontAwesomeIcons.volumeXmark,['vrCardboard']:FontAwesomeIcons.vrCardboard,['vuejs']:FontAwesomeIcons.vuejs,['w']:FontAwesomeIcons.w,['walkieTalkie']:FontAwesomeIcons.walkieTalkie,['wallet']:FontAwesomeIcons.wallet,['wandMagic']:FontAwesomeIcons.wandMagic,['wandMagicSparkles']:FontAwesomeIcons.wandMagicSparkles,['wandSparkles']:FontAwesomeIcons.wandSparkles,['warehouse']:FontAwesomeIcons.warehouse,['watchmanMonitoring']:FontAwesomeIcons.watchmanMonitoring,['water']:FontAwesomeIcons.water,['waterLadder']:FontAwesomeIcons.waterLadder,['waveSquare']:FontAwesomeIcons.waveSquare,['waze']:FontAwesomeIcons.waze,['weebly']:FontAwesomeIcons.weebly,['weibo']:FontAwesomeIcons.weibo,['weightHanging']:FontAwesomeIcons.weightHanging,['weightScale']:FontAwesomeIcons.weightScale,['weixin']:FontAwesomeIcons.weixin,['whatsapp']:FontAwesomeIcons.whatsapp,['wheatAwn']:FontAwesomeIcons.wheatAwn,['wheatAwnCircleExclamation']:FontAwesomeIcons.wheatAwnCircleExclamation,['wheelchair']:FontAwesomeIcons.wheelchair,['wheelchairMove']:FontAwesomeIcons.wheelchairMove,['whiskeyGlass']:FontAwesomeIcons.whiskeyGlass,['whmcs']:FontAwesomeIcons.whmcs,['wifi']:FontAwesomeIcons.wifi,['wikipediaW']:FontAwesomeIcons.wikipediaW,['wind']:FontAwesomeIcons.wind,['solidWindowMaximize']:FontAwesomeIcons.solidWindowMaximize,['windowMaximize']:FontAwesomeIcons.windowMaximize,['solidWindowMinimize']:FontAwesomeIcons.solidWindowMinimize,['windowMinimize']:FontAwesomeIcons.windowMinimize,['solidWindowRestore']:FontAwesomeIcons.solidWindowRestore,['windowRestore']:FontAwesomeIcons.windowRestore,['windows']:FontAwesomeIcons.windows,['wineBottle']:FontAwesomeIcons.wineBottle,['wineGlass']:FontAwesomeIcons.wineGlass,['wineGlassEmpty']:FontAwesomeIcons.wineGlassEmpty,['wirsindhandwerk']:FontAwesomeIcons.wirsindhandwerk,['wix']:FontAwesomeIcons.wix,['wizardsOfTheCoast']:FontAwesomeIcons.wizardsOfTheCoast,['wodu']:FontAwesomeIcons.wodu,['wolfPackBattalion']:FontAwesomeIcons.wolfPackBattalion,['wonSign']:FontAwesomeIcons.wonSign,['wordpress']:FontAwesomeIcons.wordpress,['wordpressSimple']:FontAwesomeIcons.wordpressSimple,['worm']:FontAwesomeIcons.worm,['wpbeginner']:FontAwesomeIcons.wpbeginner,['wpexplorer']:FontAwesomeIcons.wpexplorer,['wpforms']:FontAwesomeIcons.wpforms,['wpressr']:FontAwesomeIcons.wpressr,['wrench']:FontAwesomeIcons.wrench,['x']:FontAwesomeIcons.x,['xRay']:FontAwesomeIcons.xRay,['xbox']:FontAwesomeIcons.xbox,['xing']:FontAwesomeIcons.xing,['xmark']:FontAwesomeIcons.xmark,['xmarksLines']:FontAwesomeIcons.xmarksLines,['y']:FontAwesomeIcons.y,['yCombinator']:FontAwesomeIcons.yCombinator,['yahoo']:FontAwesomeIcons.yahoo,['yammer']:FontAwesomeIcons.yammer,['yandex']:FontAwesomeIcons.yandex,['yandexInternational']:FontAwesomeIcons.yandexInternational,['yarn']:FontAwesomeIcons.yarn,['yelp']:FontAwesomeIcons.yelp,['yenSign']:FontAwesomeIcons.yenSign,['yinYang']:FontAwesomeIcons.yinYang,['yoast']:FontAwesomeIcons.yoast,['youtube']:FontAwesomeIcons.youtube,['z']:FontAwesomeIcons.z,['zhihu']:FontAwesomeIcons.zhihu,}),['FaIcon']:(props)=>FaIcon(props.__op_idx__('pa').__op_idx__(0),{key:props.__op_idx__('key'),size:props.__op_idx__('size').toDouble(),color:props.__op_idx__('color'),semanticLabel:props.__op_idx__('semanticLabel'),textDirection:props.__op_idx__('textDirection')}),['FairBindingWidget']:(props)=>FairBindingWidget({key:props.__op_idx__('key')}),['AppTheme']:convertObjectLiteralToSetOrMap({['notWhite']:AppTheme.notWhite,['nearlyWhite']:AppTheme.nearlyWhite,['white']:AppTheme.white,['nearlyBlack']:AppTheme.nearlyBlack,['grey']:AppTheme.grey,['dark_grey']:AppTheme.dark_grey,['darkText']:AppTheme.darkText,['darkerText']:AppTheme.darkerText,['lightText']:AppTheme.lightText,['deactivatedText']:AppTheme.deactivatedText,['dismissibleBackground']:AppTheme.dismissibleBackground,['chipBackground']:AppTheme.chipBackground,['spacer']:AppTheme.spacer,['fontName']:AppTheme.fontName,['textTheme']:AppTheme.textTheme,['display1']:AppTheme.display1,['headline']:AppTheme.headline,['title']:AppTheme.title,['subtitle']:AppTheme.subtitle,['body2']:AppTheme.body2,['body1']:AppTheme.body1,['caption']:AppTheme.caption,}),['ComposerWidget']:(props)=>ComposerWidget(),['BestUiPage']:(props)=>BestUiPage({key:props.__op_idx__('key')}),['HotelAppTheme.buildLightTheme']:(props)=>HotelAppTheme.buildLightTheme(),['SmoothStarRating']:(props)=>SmoothStarRating({starCount:props.__op_idx__('starCount')??5,spacing:props.__op_idx__('spacing').toDouble()??0.0,rating:props.__op_idx__('rating').toDouble()??0.0,defaultIconData:props.__op_idx__('defaultIconData'),onRatingChanged:props.__op_idx__('onRatingChanged'),color:props.__op_idx__('color'),borderColor:props.__op_idx__('borderColor'),size:props.__op_idx__('size').toDouble()??25,filledIconData:props.__op_idx__('filledIconData'),halfFilledIconData:props.__op_idx__('halfFilledIconData'),allowHalfRating:props.__op_idx__('allowHalfRating')??true}),['MasonryGridView']:(props)=>MasonryGridView({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),children:as(props.__op_idx__('children'))??[],semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId')}),['MasonryGridView.builder']:(props)=>MasonryGridView.builder({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.custom']:(props)=>MasonryGridView.custom({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),childrenDelegate:props.__op_idx__('childrenDelegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.count']:(props)=>MasonryGridView.count({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),crossAxisCount:props.__op_idx__('crossAxisCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.extent']:(props)=>MasonryGridView.extent({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),maxCrossAxisExtent:props.__op_idx__('maxCrossAxisExtent').toDouble()??0,mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['StaggeredGrid.custom']:(props)=>StaggeredGrid.custom({key:props.__op_idx__('key'),delegate:props.__op_idx__('delegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),['StaggeredGrid.count']:(props)=>StaggeredGrid.count({key:props.__op_idx__('key'),crossAxisCount:props.__op_idx__('crossAxisCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),['StaggeredGrid.extent']:(props)=>StaggeredGrid.extent({key:props.__op_idx__('key'),maxCrossAxisExtent:props.__op_idx__('maxCrossAxisExtent').toDouble()??0,mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),});}},mapping:function mapping(){const __thiz__=this;with(__thiz__){return const{'FontAwesomeIcons':false,'FaIcon':true,'FairBindingWidget':true,'AppTheme':false,'ComposerWidget':true,'BestUiPage':true,'HotelAppTheme':false,'SmoothStarRating':true,'MasonryGridView':true,'StaggeredGrid':true};}},};AppGeneratedModule.prototype.ctor=function(){GeneratedModule.prototype.ctor.call(this)};inherit(AppGeneratedModule,GeneratedModule);}__mod__.exports.AppGeneratedModule=AppGeneratedModule;},[]);defineModule(1,function(__mod__){with(__mod__.imports){function FairAppModule(){const inner=FairAppModule.__inner__;if(this==__global__){return new FairAppModule({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);FairAppModule.prototype.ctor.apply(this,args);return this;}}FairAppModule.__inner__=function inner(){AppGeneratedModule.__inner__.call(this);};FairAppModule.prototype={components:function components(){const __thiz__=this;with(__thiz__){return(function(){let __target__=;__target__.addAll(convertObjectLiteralToSetOrMap({['SliverChildBuilderDelegate']:(props)=>SliverChildBuilderDelegate(props.__op_idx__('pa').__op_idx__(0),{childCount:props.__op_idx__('childCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,semanticIndexOffset:props.__op_idx__('semanticIndexOffset')??0}),['InputBorder.none']:InputBorder.none,}));return __target__;})();}},};FairAppModule.prototype.ctor=function(){AppGeneratedModule.prototype.ctor.call(this)};inherit(FairAppModule,AppGeneratedModule);}__mod__.exports.FairAppModule=FairAppModule;},[2]);return runCallback(function(__mod__){with(__mod__.imports){function _MyHomePageState(){const inner=_MyHomePageState.__inner__;if(this==__global__){return new _MyHomePageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MyHomePageState.prototype.ctor.apply(this,args);return this;}}_MyHomePageState.__inner__=function inner(){this.fairProps=__initProps__;this._counter=0;};_MyHomePageState.prototype={initState:function initState(){const __thiz__=this;with(__thiz__){fairProps=widget.fairProps;}},getTitle:function getTitle(){const __thiz__=this;with(__thiz__){return fairProps.__op_idx__('title');}},_incrementCounter:function _incrementCounter(){const __thiz__=this;with(__thiz__){setState('#FairKey#',function dummy(){_counter++;});}},};_MyHomePageState.prototype.ctor=function(){};;return _MyHomePageState();}},[[1,'g']]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file +GLOBAL['#FairKey#']=(function(__initProps__){const __global__=this;defineModule(2,function(__mod__){with(__mod__.imports){function AppGeneratedModule(){const inner=AppGeneratedModule.__inner__;if(this==__global__){return new AppGeneratedModule({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);AppGeneratedModule.prototype.ctor.apply(this,args);return this;}}AppGeneratedModule.__inner__=function inner(){GeneratedModule.__inner__.call(this);};AppGeneratedModule.prototype={components:function components(){const __thiz__=this;with(__thiz__){return convertObjectLiteralToSetOrMap({['FontAwesomeIcons']:convertObjectLiteralToSetOrMap({['zero']:FontAwesomeIcons.zero,['one']:FontAwesomeIcons.one,['two']:FontAwesomeIcons.two,['three']:FontAwesomeIcons.three,['four']:FontAwesomeIcons.four,['five']:FontAwesomeIcons.five,['six']:FontAwesomeIcons.six,['seven']:FontAwesomeIcons.seven,['eight']:FontAwesomeIcons.eight,['nine']:FontAwesomeIcons.nine,['fortyTwoGroup']:FontAwesomeIcons.fortyTwoGroup,['fiveHundredPx']:FontAwesomeIcons.fiveHundredPx,['a']:FontAwesomeIcons.a,['accessibleIcon']:FontAwesomeIcons.accessibleIcon,['accusoft']:FontAwesomeIcons.accusoft,['solidAddressBook']:FontAwesomeIcons.solidAddressBook,['addressBook']:FontAwesomeIcons.addressBook,['solidAddressCard']:FontAwesomeIcons.solidAddressCard,['addressCard']:FontAwesomeIcons.addressCard,['adn']:FontAwesomeIcons.adn,['adversal']:FontAwesomeIcons.adversal,['affiliatetheme']:FontAwesomeIcons.affiliatetheme,['airbnb']:FontAwesomeIcons.airbnb,['algolia']:FontAwesomeIcons.algolia,['alignCenter']:FontAwesomeIcons.alignCenter,['alignJustify']:FontAwesomeIcons.alignJustify,['alignLeft']:FontAwesomeIcons.alignLeft,['alignRight']:FontAwesomeIcons.alignRight,['alipay']:FontAwesomeIcons.alipay,['amazon']:FontAwesomeIcons.amazon,['amazonPay']:FontAwesomeIcons.amazonPay,['amilia']:FontAwesomeIcons.amilia,['anchor']:FontAwesomeIcons.anchor,['anchorCircleCheck']:FontAwesomeIcons.anchorCircleCheck,['anchorCircleExclamation']:FontAwesomeIcons.anchorCircleExclamation,['anchorCircleXmark']:FontAwesomeIcons.anchorCircleXmark,['anchorLock']:FontAwesomeIcons.anchorLock,['android']:FontAwesomeIcons.android,['angellist']:FontAwesomeIcons.angellist,['angleDown']:FontAwesomeIcons.angleDown,['angleLeft']:FontAwesomeIcons.angleLeft,['angleRight']:FontAwesomeIcons.angleRight,['angleUp']:FontAwesomeIcons.angleUp,['anglesDown']:FontAwesomeIcons.anglesDown,['anglesLeft']:FontAwesomeIcons.anglesLeft,['anglesRight']:FontAwesomeIcons.anglesRight,['anglesUp']:FontAwesomeIcons.anglesUp,['angrycreative']:FontAwesomeIcons.angrycreative,['angular']:FontAwesomeIcons.angular,['ankh']:FontAwesomeIcons.ankh,['appStore']:FontAwesomeIcons.appStore,['appStoreIos']:FontAwesomeIcons.appStoreIos,['apper']:FontAwesomeIcons.apper,['apple']:FontAwesomeIcons.apple,['applePay']:FontAwesomeIcons.applePay,['appleWhole']:FontAwesomeIcons.appleWhole,['archway']:FontAwesomeIcons.archway,['arrowDown']:FontAwesomeIcons.arrowDown,['arrowDown19']:FontAwesomeIcons.arrowDown19,['arrowDown91']:FontAwesomeIcons.arrowDown91,['arrowDownAZ']:FontAwesomeIcons.arrowDownAZ,['arrowDownLong']:FontAwesomeIcons.arrowDownLong,['arrowDownShortWide']:FontAwesomeIcons.arrowDownShortWide,['arrowDownUpAcrossLine']:FontAwesomeIcons.arrowDownUpAcrossLine,['arrowDownUpLock']:FontAwesomeIcons.arrowDownUpLock,['arrowDownWideShort']:FontAwesomeIcons.arrowDownWideShort,['arrowDownZA']:FontAwesomeIcons.arrowDownZA,['arrowLeft']:FontAwesomeIcons.arrowLeft,['arrowLeftLong']:FontAwesomeIcons.arrowLeftLong,['arrowPointer']:FontAwesomeIcons.arrowPointer,['arrowRight']:FontAwesomeIcons.arrowRight,['arrowRightArrowLeft']:FontAwesomeIcons.arrowRightArrowLeft,['arrowRightFromBracket']:FontAwesomeIcons.arrowRightFromBracket,['arrowRightLong']:FontAwesomeIcons.arrowRightLong,['arrowRightToBracket']:FontAwesomeIcons.arrowRightToBracket,['arrowRightToCity']:FontAwesomeIcons.arrowRightToCity,['arrowRotateLeft']:FontAwesomeIcons.arrowRotateLeft,['arrowRotateRight']:FontAwesomeIcons.arrowRotateRight,['arrowTrendDown']:FontAwesomeIcons.arrowTrendDown,['arrowTrendUp']:FontAwesomeIcons.arrowTrendUp,['arrowTurnDown']:FontAwesomeIcons.arrowTurnDown,['arrowTurnUp']:FontAwesomeIcons.arrowTurnUp,['arrowUp']:FontAwesomeIcons.arrowUp,['arrowUp19']:FontAwesomeIcons.arrowUp19,['arrowUp91']:FontAwesomeIcons.arrowUp91,['arrowUpAZ']:FontAwesomeIcons.arrowUpAZ,['arrowUpFromBracket']:FontAwesomeIcons.arrowUpFromBracket,['arrowUpFromGroundWater']:FontAwesomeIcons.arrowUpFromGroundWater,['arrowUpFromWaterPump']:FontAwesomeIcons.arrowUpFromWaterPump,['arrowUpLong']:FontAwesomeIcons.arrowUpLong,['arrowUpRightDots']:FontAwesomeIcons.arrowUpRightDots,['arrowUpRightFromSquare']:FontAwesomeIcons.arrowUpRightFromSquare,['arrowUpShortWide']:FontAwesomeIcons.arrowUpShortWide,['arrowUpWideShort']:FontAwesomeIcons.arrowUpWideShort,['arrowUpZA']:FontAwesomeIcons.arrowUpZA,['arrowsDownToLine']:FontAwesomeIcons.arrowsDownToLine,['arrowsDownToPeople']:FontAwesomeIcons.arrowsDownToPeople,['arrowsLeftRight']:FontAwesomeIcons.arrowsLeftRight,['arrowsLeftRightToLine']:FontAwesomeIcons.arrowsLeftRightToLine,['arrowsRotate']:FontAwesomeIcons.arrowsRotate,['arrowsSpin']:FontAwesomeIcons.arrowsSpin,['arrowsSplitUpAndLeft']:FontAwesomeIcons.arrowsSplitUpAndLeft,['arrowsToCircle']:FontAwesomeIcons.arrowsToCircle,['arrowsToDot']:FontAwesomeIcons.arrowsToDot,['arrowsToEye']:FontAwesomeIcons.arrowsToEye,['arrowsTurnRight']:FontAwesomeIcons.arrowsTurnRight,['arrowsTurnToDots']:FontAwesomeIcons.arrowsTurnToDots,['arrowsUpDown']:FontAwesomeIcons.arrowsUpDown,['arrowsUpDownLeftRight']:FontAwesomeIcons.arrowsUpDownLeftRight,['arrowsUpToLine']:FontAwesomeIcons.arrowsUpToLine,['artstation']:FontAwesomeIcons.artstation,['asterisk']:FontAwesomeIcons.asterisk,['asymmetrik']:FontAwesomeIcons.asymmetrik,['at']:FontAwesomeIcons.at,['atlassian']:FontAwesomeIcons.atlassian,['atom']:FontAwesomeIcons.atom,['audible']:FontAwesomeIcons.audible,['audioDescription']:FontAwesomeIcons.audioDescription,['australSign']:FontAwesomeIcons.australSign,['autoprefixer']:FontAwesomeIcons.autoprefixer,['avianex']:FontAwesomeIcons.avianex,['aviato']:FontAwesomeIcons.aviato,['award']:FontAwesomeIcons.award,['aws']:FontAwesomeIcons.aws,['b']:FontAwesomeIcons.b,['baby']:FontAwesomeIcons.baby,['babyCarriage']:FontAwesomeIcons.babyCarriage,['backward']:FontAwesomeIcons.backward,['backwardFast']:FontAwesomeIcons.backwardFast,['backwardStep']:FontAwesomeIcons.backwardStep,['bacon']:FontAwesomeIcons.bacon,['bacteria']:FontAwesomeIcons.bacteria,['bacterium']:FontAwesomeIcons.bacterium,['bagShopping']:FontAwesomeIcons.bagShopping,['bahai']:FontAwesomeIcons.bahai,['bahtSign']:FontAwesomeIcons.bahtSign,['ban']:FontAwesomeIcons.ban,['banSmoking']:FontAwesomeIcons.banSmoking,['bandage']:FontAwesomeIcons.bandage,['bandcamp']:FontAwesomeIcons.bandcamp,['bangladeshiTakaSign']:FontAwesomeIcons.bangladeshiTakaSign,['barcode']:FontAwesomeIcons.barcode,['bars']:FontAwesomeIcons.bars,['barsProgress']:FontAwesomeIcons.barsProgress,['barsStaggered']:FontAwesomeIcons.barsStaggered,['baseball']:FontAwesomeIcons.baseball,['baseballBatBall']:FontAwesomeIcons.baseballBatBall,['basketShopping']:FontAwesomeIcons.basketShopping,['basketball']:FontAwesomeIcons.basketball,['bath']:FontAwesomeIcons.bath,['batteryEmpty']:FontAwesomeIcons.batteryEmpty,['batteryFull']:FontAwesomeIcons.batteryFull,['batteryHalf']:FontAwesomeIcons.batteryHalf,['batteryQuarter']:FontAwesomeIcons.batteryQuarter,['batteryThreeQuarters']:FontAwesomeIcons.batteryThreeQuarters,['battleNet']:FontAwesomeIcons.battleNet,['bed']:FontAwesomeIcons.bed,['bedPulse']:FontAwesomeIcons.bedPulse,['beerMugEmpty']:FontAwesomeIcons.beerMugEmpty,['behance']:FontAwesomeIcons.behance,['solidBell']:FontAwesomeIcons.solidBell,['bell']:FontAwesomeIcons.bell,['bellConcierge']:FontAwesomeIcons.bellConcierge,['solidBellSlash']:FontAwesomeIcons.solidBellSlash,['bellSlash']:FontAwesomeIcons.bellSlash,['bezierCurve']:FontAwesomeIcons.bezierCurve,['bicycle']:FontAwesomeIcons.bicycle,['bilibili']:FontAwesomeIcons.bilibili,['bimobject']:FontAwesomeIcons.bimobject,['binoculars']:FontAwesomeIcons.binoculars,['biohazard']:FontAwesomeIcons.biohazard,['bitbucket']:FontAwesomeIcons.bitbucket,['bitcoin']:FontAwesomeIcons.bitcoin,['bitcoinSign']:FontAwesomeIcons.bitcoinSign,['bity']:FontAwesomeIcons.bity,['blackTie']:FontAwesomeIcons.blackTie,['blackberry']:FontAwesomeIcons.blackberry,['blender']:FontAwesomeIcons.blender,['blenderPhone']:FontAwesomeIcons.blenderPhone,['blog']:FontAwesomeIcons.blog,['blogger']:FontAwesomeIcons.blogger,['bloggerB']:FontAwesomeIcons.bloggerB,['bluetooth']:FontAwesomeIcons.bluetooth,['bluetoothB']:FontAwesomeIcons.bluetoothB,['bold']:FontAwesomeIcons.bold,['bolt']:FontAwesomeIcons.bolt,['boltLightning']:FontAwesomeIcons.boltLightning,['bomb']:FontAwesomeIcons.bomb,['bone']:FontAwesomeIcons.bone,['bong']:FontAwesomeIcons.bong,['book']:FontAwesomeIcons.book,['bookAtlas']:FontAwesomeIcons.bookAtlas,['bookBible']:FontAwesomeIcons.bookBible,['bookBookmark']:FontAwesomeIcons.bookBookmark,['bookJournalWhills']:FontAwesomeIcons.bookJournalWhills,['bookMedical']:FontAwesomeIcons.bookMedical,['bookOpen']:FontAwesomeIcons.bookOpen,['bookOpenReader']:FontAwesomeIcons.bookOpenReader,['bookQuran']:FontAwesomeIcons.bookQuran,['bookSkull']:FontAwesomeIcons.bookSkull,['bookTanakh']:FontAwesomeIcons.bookTanakh,['solidBookmark']:FontAwesomeIcons.solidBookmark,['bookmark']:FontAwesomeIcons.bookmark,['bootstrap']:FontAwesomeIcons.bootstrap,['borderAll']:FontAwesomeIcons.borderAll,['borderNone']:FontAwesomeIcons.borderNone,['borderTopLeft']:FontAwesomeIcons.borderTopLeft,['boreHole']:FontAwesomeIcons.boreHole,['bots']:FontAwesomeIcons.bots,['bottleDroplet']:FontAwesomeIcons.bottleDroplet,['bottleWater']:FontAwesomeIcons.bottleWater,['bowlFood']:FontAwesomeIcons.bowlFood,['bowlRice']:FontAwesomeIcons.bowlRice,['bowlingBall']:FontAwesomeIcons.bowlingBall,['box']:FontAwesomeIcons.box,['boxArchive']:FontAwesomeIcons.boxArchive,['boxOpen']:FontAwesomeIcons.boxOpen,['boxTissue']:FontAwesomeIcons.boxTissue,['boxesPacking']:FontAwesomeIcons.boxesPacking,['boxesStacked']:FontAwesomeIcons.boxesStacked,['braille']:FontAwesomeIcons.braille,['brain']:FontAwesomeIcons.brain,['brazilianRealSign']:FontAwesomeIcons.brazilianRealSign,['breadSlice']:FontAwesomeIcons.breadSlice,['bridge']:FontAwesomeIcons.bridge,['bridgeCircleCheck']:FontAwesomeIcons.bridgeCircleCheck,['bridgeCircleExclamation']:FontAwesomeIcons.bridgeCircleExclamation,['bridgeCircleXmark']:FontAwesomeIcons.bridgeCircleXmark,['bridgeLock']:FontAwesomeIcons.bridgeLock,['bridgeWater']:FontAwesomeIcons.bridgeWater,['briefcase']:FontAwesomeIcons.briefcase,['briefcaseMedical']:FontAwesomeIcons.briefcaseMedical,['broom']:FontAwesomeIcons.broom,['broomBall']:FontAwesomeIcons.broomBall,['brush']:FontAwesomeIcons.brush,['btc']:FontAwesomeIcons.btc,['bucket']:FontAwesomeIcons.bucket,['buffer']:FontAwesomeIcons.buffer,['bug']:FontAwesomeIcons.bug,['bugSlash']:FontAwesomeIcons.bugSlash,['bugs']:FontAwesomeIcons.bugs,['solidBuilding']:FontAwesomeIcons.solidBuilding,['building']:FontAwesomeIcons.building,['buildingCircleArrowRight']:FontAwesomeIcons.buildingCircleArrowRight,['buildingCircleCheck']:FontAwesomeIcons.buildingCircleCheck,['buildingCircleExclamation']:FontAwesomeIcons.buildingCircleExclamation,['buildingCircleXmark']:FontAwesomeIcons.buildingCircleXmark,['buildingColumns']:FontAwesomeIcons.buildingColumns,['buildingFlag']:FontAwesomeIcons.buildingFlag,['buildingLock']:FontAwesomeIcons.buildingLock,['buildingNgo']:FontAwesomeIcons.buildingNgo,['buildingShield']:FontAwesomeIcons.buildingShield,['buildingUn']:FontAwesomeIcons.buildingUn,['buildingUser']:FontAwesomeIcons.buildingUser,['buildingWheat']:FontAwesomeIcons.buildingWheat,['bullhorn']:FontAwesomeIcons.bullhorn,['bullseye']:FontAwesomeIcons.bullseye,['burger']:FontAwesomeIcons.burger,['buromobelexperte']:FontAwesomeIcons.buromobelexperte,['burst']:FontAwesomeIcons.burst,['bus']:FontAwesomeIcons.bus,['busSimple']:FontAwesomeIcons.busSimple,['businessTime']:FontAwesomeIcons.businessTime,['buyNLarge']:FontAwesomeIcons.buyNLarge,['buysellads']:FontAwesomeIcons.buysellads,['c']:FontAwesomeIcons.c,['cableCar']:FontAwesomeIcons.cableCar,['cakeCandles']:FontAwesomeIcons.cakeCandles,['calculator']:FontAwesomeIcons.calculator,['solidCalendar']:FontAwesomeIcons.solidCalendar,['calendar']:FontAwesomeIcons.calendar,['solidCalendarCheck']:FontAwesomeIcons.solidCalendarCheck,['calendarCheck']:FontAwesomeIcons.calendarCheck,['calendarDay']:FontAwesomeIcons.calendarDay,['solidCalendarDays']:FontAwesomeIcons.solidCalendarDays,['calendarDays']:FontAwesomeIcons.calendarDays,['solidCalendarMinus']:FontAwesomeIcons.solidCalendarMinus,['calendarMinus']:FontAwesomeIcons.calendarMinus,['solidCalendarPlus']:FontAwesomeIcons.solidCalendarPlus,['calendarPlus']:FontAwesomeIcons.calendarPlus,['calendarWeek']:FontAwesomeIcons.calendarWeek,['solidCalendarXmark']:FontAwesomeIcons.solidCalendarXmark,['calendarXmark']:FontAwesomeIcons.calendarXmark,['camera']:FontAwesomeIcons.camera,['cameraRetro']:FontAwesomeIcons.cameraRetro,['cameraRotate']:FontAwesomeIcons.cameraRotate,['campground']:FontAwesomeIcons.campground,['canadianMapleLeaf']:FontAwesomeIcons.canadianMapleLeaf,['candyCane']:FontAwesomeIcons.candyCane,['cannabis']:FontAwesomeIcons.cannabis,['capsules']:FontAwesomeIcons.capsules,['car']:FontAwesomeIcons.car,['carBattery']:FontAwesomeIcons.carBattery,['carBurst']:FontAwesomeIcons.carBurst,['carOn']:FontAwesomeIcons.carOn,['carRear']:FontAwesomeIcons.carRear,['carSide']:FontAwesomeIcons.carSide,['carTunnel']:FontAwesomeIcons.carTunnel,['caravan']:FontAwesomeIcons.caravan,['caretDown']:FontAwesomeIcons.caretDown,['caretLeft']:FontAwesomeIcons.caretLeft,['caretRight']:FontAwesomeIcons.caretRight,['caretUp']:FontAwesomeIcons.caretUp,['carrot']:FontAwesomeIcons.carrot,['cartArrowDown']:FontAwesomeIcons.cartArrowDown,['cartFlatbed']:FontAwesomeIcons.cartFlatbed,['cartFlatbedSuitcase']:FontAwesomeIcons.cartFlatbedSuitcase,['cartPlus']:FontAwesomeIcons.cartPlus,['cartShopping']:FontAwesomeIcons.cartShopping,['cashRegister']:FontAwesomeIcons.cashRegister,['cat']:FontAwesomeIcons.cat,['ccAmazonPay']:FontAwesomeIcons.ccAmazonPay,['ccAmex']:FontAwesomeIcons.ccAmex,['ccApplePay']:FontAwesomeIcons.ccApplePay,['ccDinersClub']:FontAwesomeIcons.ccDinersClub,['ccDiscover']:FontAwesomeIcons.ccDiscover,['ccJcb']:FontAwesomeIcons.ccJcb,['ccMastercard']:FontAwesomeIcons.ccMastercard,['ccPaypal']:FontAwesomeIcons.ccPaypal,['ccStripe']:FontAwesomeIcons.ccStripe,['ccVisa']:FontAwesomeIcons.ccVisa,['cediSign']:FontAwesomeIcons.cediSign,['centSign']:FontAwesomeIcons.centSign,['centercode']:FontAwesomeIcons.centercode,['centos']:FontAwesomeIcons.centos,['certificate']:FontAwesomeIcons.certificate,['chair']:FontAwesomeIcons.chair,['chalkboard']:FontAwesomeIcons.chalkboard,['chalkboardUser']:FontAwesomeIcons.chalkboardUser,['champagneGlasses']:FontAwesomeIcons.champagneGlasses,['chargingStation']:FontAwesomeIcons.chargingStation,['chartArea']:FontAwesomeIcons.chartArea,['solidChartBar']:FontAwesomeIcons.solidChartBar,['chartBar']:FontAwesomeIcons.chartBar,['chartColumn']:FontAwesomeIcons.chartColumn,['chartGantt']:FontAwesomeIcons.chartGantt,['chartLine']:FontAwesomeIcons.chartLine,['chartPie']:FontAwesomeIcons.chartPie,['chartSimple']:FontAwesomeIcons.chartSimple,['check']:FontAwesomeIcons.check,['checkDouble']:FontAwesomeIcons.checkDouble,['checkToSlot']:FontAwesomeIcons.checkToSlot,['cheese']:FontAwesomeIcons.cheese,['chess']:FontAwesomeIcons.chess,['solidChessBishop']:FontAwesomeIcons.solidChessBishop,['chessBishop']:FontAwesomeIcons.chessBishop,['chessBoard']:FontAwesomeIcons.chessBoard,['solidChessKing']:FontAwesomeIcons.solidChessKing,['chessKing']:FontAwesomeIcons.chessKing,['solidChessKnight']:FontAwesomeIcons.solidChessKnight,['chessKnight']:FontAwesomeIcons.chessKnight,['solidChessPawn']:FontAwesomeIcons.solidChessPawn,['chessPawn']:FontAwesomeIcons.chessPawn,['solidChessQueen']:FontAwesomeIcons.solidChessQueen,['chessQueen']:FontAwesomeIcons.chessQueen,['solidChessRook']:FontAwesomeIcons.solidChessRook,['chessRook']:FontAwesomeIcons.chessRook,['chevronDown']:FontAwesomeIcons.chevronDown,['chevronLeft']:FontAwesomeIcons.chevronLeft,['chevronRight']:FontAwesomeIcons.chevronRight,['chevronUp']:FontAwesomeIcons.chevronUp,['child']:FontAwesomeIcons.child,['childCombatant']:FontAwesomeIcons.childCombatant,['childDress']:FontAwesomeIcons.childDress,['childReaching']:FontAwesomeIcons.childReaching,['children']:FontAwesomeIcons.children,['chrome']:FontAwesomeIcons.chrome,['chromecast']:FontAwesomeIcons.chromecast,['church']:FontAwesomeIcons.church,['solidCircle']:FontAwesomeIcons.solidCircle,['circle']:FontAwesomeIcons.circle,['circleArrowDown']:FontAwesomeIcons.circleArrowDown,['circleArrowLeft']:FontAwesomeIcons.circleArrowLeft,['circleArrowRight']:FontAwesomeIcons.circleArrowRight,['circleArrowUp']:FontAwesomeIcons.circleArrowUp,['solidCircleCheck']:FontAwesomeIcons.solidCircleCheck,['circleCheck']:FontAwesomeIcons.circleCheck,['circleChevronDown']:FontAwesomeIcons.circleChevronDown,['circleChevronLeft']:FontAwesomeIcons.circleChevronLeft,['circleChevronRight']:FontAwesomeIcons.circleChevronRight,['circleChevronUp']:FontAwesomeIcons.circleChevronUp,['circleDollarToSlot']:FontAwesomeIcons.circleDollarToSlot,['solidCircleDot']:FontAwesomeIcons.solidCircleDot,['circleDot']:FontAwesomeIcons.circleDot,['solidCircleDown']:FontAwesomeIcons.solidCircleDown,['circleDown']:FontAwesomeIcons.circleDown,['circleExclamation']:FontAwesomeIcons.circleExclamation,['circleH']:FontAwesomeIcons.circleH,['circleHalfStroke']:FontAwesomeIcons.circleHalfStroke,['circleInfo']:FontAwesomeIcons.circleInfo,['solidCircleLeft']:FontAwesomeIcons.solidCircleLeft,['circleLeft']:FontAwesomeIcons.circleLeft,['circleMinus']:FontAwesomeIcons.circleMinus,['circleNodes']:FontAwesomeIcons.circleNodes,['circleNotch']:FontAwesomeIcons.circleNotch,['solidCirclePause']:FontAwesomeIcons.solidCirclePause,['circlePause']:FontAwesomeIcons.circlePause,['solidCirclePlay']:FontAwesomeIcons.solidCirclePlay,['circlePlay']:FontAwesomeIcons.circlePlay,['circlePlus']:FontAwesomeIcons.circlePlus,['solidCircleQuestion']:FontAwesomeIcons.solidCircleQuestion,['circleQuestion']:FontAwesomeIcons.circleQuestion,['circleRadiation']:FontAwesomeIcons.circleRadiation,['solidCircleRight']:FontAwesomeIcons.solidCircleRight,['circleRight']:FontAwesomeIcons.circleRight,['solidCircleStop']:FontAwesomeIcons.solidCircleStop,['circleStop']:FontAwesomeIcons.circleStop,['solidCircleUp']:FontAwesomeIcons.solidCircleUp,['circleUp']:FontAwesomeIcons.circleUp,['solidCircleUser']:FontAwesomeIcons.solidCircleUser,['circleUser']:FontAwesomeIcons.circleUser,['solidCircleXmark']:FontAwesomeIcons.solidCircleXmark,['circleXmark']:FontAwesomeIcons.circleXmark,['city']:FontAwesomeIcons.city,['clapperboard']:FontAwesomeIcons.clapperboard,['solidClipboard']:FontAwesomeIcons.solidClipboard,['clipboard']:FontAwesomeIcons.clipboard,['clipboardCheck']:FontAwesomeIcons.clipboardCheck,['clipboardList']:FontAwesomeIcons.clipboardList,['clipboardQuestion']:FontAwesomeIcons.clipboardQuestion,['clipboardUser']:FontAwesomeIcons.clipboardUser,['solidClock']:FontAwesomeIcons.solidClock,['clock']:FontAwesomeIcons.clock,['clockRotateLeft']:FontAwesomeIcons.clockRotateLeft,['solidClone']:FontAwesomeIcons.solidClone,['clone']:FontAwesomeIcons.clone,['solidClosedCaptioning']:FontAwesomeIcons.solidClosedCaptioning,['closedCaptioning']:FontAwesomeIcons.closedCaptioning,['cloud']:FontAwesomeIcons.cloud,['cloudArrowDown']:FontAwesomeIcons.cloudArrowDown,['cloudArrowUp']:FontAwesomeIcons.cloudArrowUp,['cloudBolt']:FontAwesomeIcons.cloudBolt,['cloudMeatball']:FontAwesomeIcons.cloudMeatball,['cloudMoon']:FontAwesomeIcons.cloudMoon,['cloudMoonRain']:FontAwesomeIcons.cloudMoonRain,['cloudRain']:FontAwesomeIcons.cloudRain,['cloudShowersHeavy']:FontAwesomeIcons.cloudShowersHeavy,['cloudShowersWater']:FontAwesomeIcons.cloudShowersWater,['cloudSun']:FontAwesomeIcons.cloudSun,['cloudSunRain']:FontAwesomeIcons.cloudSunRain,['cloudflare']:FontAwesomeIcons.cloudflare,['cloudscale']:FontAwesomeIcons.cloudscale,['cloudsmith']:FontAwesomeIcons.cloudsmith,['cloudversify']:FontAwesomeIcons.cloudversify,['clover']:FontAwesomeIcons.clover,['cmplid']:FontAwesomeIcons.cmplid,['code']:FontAwesomeIcons.code,['codeBranch']:FontAwesomeIcons.codeBranch,['codeCommit']:FontAwesomeIcons.codeCommit,['codeCompare']:FontAwesomeIcons.codeCompare,['codeFork']:FontAwesomeIcons.codeFork,['codeMerge']:FontAwesomeIcons.codeMerge,['codePullRequest']:FontAwesomeIcons.codePullRequest,['codepen']:FontAwesomeIcons.codepen,['codiepie']:FontAwesomeIcons.codiepie,['coins']:FontAwesomeIcons.coins,['colonSign']:FontAwesomeIcons.colonSign,['solidComment']:FontAwesomeIcons.solidComment,['comment']:FontAwesomeIcons.comment,['commentDollar']:FontAwesomeIcons.commentDollar,['solidCommentDots']:FontAwesomeIcons.solidCommentDots,['commentDots']:FontAwesomeIcons.commentDots,['commentMedical']:FontAwesomeIcons.commentMedical,['commentSlash']:FontAwesomeIcons.commentSlash,['commentSms']:FontAwesomeIcons.commentSms,['solidComments']:FontAwesomeIcons.solidComments,['comments']:FontAwesomeIcons.comments,['commentsDollar']:FontAwesomeIcons.commentsDollar,['compactDisc']:FontAwesomeIcons.compactDisc,['solidCompass']:FontAwesomeIcons.solidCompass,['compass']:FontAwesomeIcons.compass,['compassDrafting']:FontAwesomeIcons.compassDrafting,['compress']:FontAwesomeIcons.compress,['computer']:FontAwesomeIcons.computer,['computerMouse']:FontAwesomeIcons.computerMouse,['confluence']:FontAwesomeIcons.confluence,['connectdevelop']:FontAwesomeIcons.connectdevelop,['contao']:FontAwesomeIcons.contao,['cookie']:FontAwesomeIcons.cookie,['cookieBite']:FontAwesomeIcons.cookieBite,['solidCopy']:FontAwesomeIcons.solidCopy,['copy']:FontAwesomeIcons.copy,['solidCopyright']:FontAwesomeIcons.solidCopyright,['copyright']:FontAwesomeIcons.copyright,['cottonBureau']:FontAwesomeIcons.cottonBureau,['couch']:FontAwesomeIcons.couch,['cow']:FontAwesomeIcons.cow,['cpanel']:FontAwesomeIcons.cpanel,['creativeCommons']:FontAwesomeIcons.creativeCommons,['creativeCommonsBy']:FontAwesomeIcons.creativeCommonsBy,['creativeCommonsNc']:FontAwesomeIcons.creativeCommonsNc,['creativeCommonsNcEu']:FontAwesomeIcons.creativeCommonsNcEu,['creativeCommonsNcJp']:FontAwesomeIcons.creativeCommonsNcJp,['creativeCommonsNd']:FontAwesomeIcons.creativeCommonsNd,['creativeCommonsPd']:FontAwesomeIcons.creativeCommonsPd,['creativeCommonsPdAlt']:FontAwesomeIcons.creativeCommonsPdAlt,['creativeCommonsRemix']:FontAwesomeIcons.creativeCommonsRemix,['creativeCommonsSa']:FontAwesomeIcons.creativeCommonsSa,['creativeCommonsSampling']:FontAwesomeIcons.creativeCommonsSampling,['creativeCommonsSamplingPlus']:FontAwesomeIcons.creativeCommonsSamplingPlus,['creativeCommonsShare']:FontAwesomeIcons.creativeCommonsShare,['creativeCommonsZero']:FontAwesomeIcons.creativeCommonsZero,['solidCreditCard']:FontAwesomeIcons.solidCreditCard,['creditCard']:FontAwesomeIcons.creditCard,['criticalRole']:FontAwesomeIcons.criticalRole,['crop']:FontAwesomeIcons.crop,['cropSimple']:FontAwesomeIcons.cropSimple,['cross']:FontAwesomeIcons.cross,['crosshairs']:FontAwesomeIcons.crosshairs,['crow']:FontAwesomeIcons.crow,['crown']:FontAwesomeIcons.crown,['crutch']:FontAwesomeIcons.crutch,['cruzeiroSign']:FontAwesomeIcons.cruzeiroSign,['css3']:FontAwesomeIcons.css3,['css3Alt']:FontAwesomeIcons.css3Alt,['cube']:FontAwesomeIcons.cube,['cubes']:FontAwesomeIcons.cubes,['cubesStacked']:FontAwesomeIcons.cubesStacked,['cuttlefish']:FontAwesomeIcons.cuttlefish,['d']:FontAwesomeIcons.d,['dAndD']:FontAwesomeIcons.dAndD,['dAndDBeyond']:FontAwesomeIcons.dAndDBeyond,['dailymotion']:FontAwesomeIcons.dailymotion,['dashcube']:FontAwesomeIcons.dashcube,['database']:FontAwesomeIcons.database,['deezer']:FontAwesomeIcons.deezer,['deleteLeft']:FontAwesomeIcons.deleteLeft,['delicious']:FontAwesomeIcons.delicious,['democrat']:FontAwesomeIcons.democrat,['deploydog']:FontAwesomeIcons.deploydog,['deskpro']:FontAwesomeIcons.deskpro,['desktop']:FontAwesomeIcons.desktop,['dev']:FontAwesomeIcons.dev,['deviantart']:FontAwesomeIcons.deviantart,['dharmachakra']:FontAwesomeIcons.dharmachakra,['dhl']:FontAwesomeIcons.dhl,['diagramNext']:FontAwesomeIcons.diagramNext,['diagramPredecessor']:FontAwesomeIcons.diagramPredecessor,['diagramProject']:FontAwesomeIcons.diagramProject,['diagramSuccessor']:FontAwesomeIcons.diagramSuccessor,['diamond']:FontAwesomeIcons.diamond,['diamondTurnRight']:FontAwesomeIcons.diamondTurnRight,['diaspora']:FontAwesomeIcons.diaspora,['dice']:FontAwesomeIcons.dice,['diceD20']:FontAwesomeIcons.diceD20,['diceD6']:FontAwesomeIcons.diceD6,['diceFive']:FontAwesomeIcons.diceFive,['diceFour']:FontAwesomeIcons.diceFour,['diceOne']:FontAwesomeIcons.diceOne,['diceSix']:FontAwesomeIcons.diceSix,['diceThree']:FontAwesomeIcons.diceThree,['diceTwo']:FontAwesomeIcons.diceTwo,['digg']:FontAwesomeIcons.digg,['digitalOcean']:FontAwesomeIcons.digitalOcean,['discord']:FontAwesomeIcons.discord,['discourse']:FontAwesomeIcons.discourse,['disease']:FontAwesomeIcons.disease,['display']:FontAwesomeIcons.display,['divide']:FontAwesomeIcons.divide,['dna']:FontAwesomeIcons.dna,['dochub']:FontAwesomeIcons.dochub,['docker']:FontAwesomeIcons.docker,['dog']:FontAwesomeIcons.dog,['dollarSign']:FontAwesomeIcons.dollarSign,['dolly']:FontAwesomeIcons.dolly,['dongSign']:FontAwesomeIcons.dongSign,['doorClosed']:FontAwesomeIcons.doorClosed,['doorOpen']:FontAwesomeIcons.doorOpen,['dove']:FontAwesomeIcons.dove,['downLeftAndUpRightToCenter']:FontAwesomeIcons.downLeftAndUpRightToCenter,['downLong']:FontAwesomeIcons.downLong,['download']:FontAwesomeIcons.download,['draft2digital']:FontAwesomeIcons.draft2digital,['dragon']:FontAwesomeIcons.dragon,['drawPolygon']:FontAwesomeIcons.drawPolygon,['dribbble']:FontAwesomeIcons.dribbble,['dropbox']:FontAwesomeIcons.dropbox,['droplet']:FontAwesomeIcons.droplet,['dropletSlash']:FontAwesomeIcons.dropletSlash,['drum']:FontAwesomeIcons.drum,['drumSteelpan']:FontAwesomeIcons.drumSteelpan,['drumstickBite']:FontAwesomeIcons.drumstickBite,['drupal']:FontAwesomeIcons.drupal,['dumbbell']:FontAwesomeIcons.dumbbell,['dumpster']:FontAwesomeIcons.dumpster,['dumpsterFire']:FontAwesomeIcons.dumpsterFire,['dungeon']:FontAwesomeIcons.dungeon,['dyalog']:FontAwesomeIcons.dyalog,['e']:FontAwesomeIcons.e,['earDeaf']:FontAwesomeIcons.earDeaf,['earListen']:FontAwesomeIcons.earListen,['earlybirds']:FontAwesomeIcons.earlybirds,['earthAfrica']:FontAwesomeIcons.earthAfrica,['earthAmericas']:FontAwesomeIcons.earthAmericas,['earthAsia']:FontAwesomeIcons.earthAsia,['earthEurope']:FontAwesomeIcons.earthEurope,['earthOceania']:FontAwesomeIcons.earthOceania,['ebay']:FontAwesomeIcons.ebay,['edge']:FontAwesomeIcons.edge,['edgeLegacy']:FontAwesomeIcons.edgeLegacy,['egg']:FontAwesomeIcons.egg,['eject']:FontAwesomeIcons.eject,['elementor']:FontAwesomeIcons.elementor,['elevator']:FontAwesomeIcons.elevator,['ellipsis']:FontAwesomeIcons.ellipsis,['ellipsisVertical']:FontAwesomeIcons.ellipsisVertical,['ello']:FontAwesomeIcons.ello,['ember']:FontAwesomeIcons.ember,['empire']:FontAwesomeIcons.empire,['solidEnvelope']:FontAwesomeIcons.solidEnvelope,['envelope']:FontAwesomeIcons.envelope,['envelopeCircleCheck']:FontAwesomeIcons.envelopeCircleCheck,['solidEnvelopeOpen']:FontAwesomeIcons.solidEnvelopeOpen,['envelopeOpen']:FontAwesomeIcons.envelopeOpen,['envelopeOpenText']:FontAwesomeIcons.envelopeOpenText,['envelopesBulk']:FontAwesomeIcons.envelopesBulk,['envira']:FontAwesomeIcons.envira,['equals']:FontAwesomeIcons.equals,['eraser']:FontAwesomeIcons.eraser,['erlang']:FontAwesomeIcons.erlang,['ethereum']:FontAwesomeIcons.ethereum,['ethernet']:FontAwesomeIcons.ethernet,['etsy']:FontAwesomeIcons.etsy,['euroSign']:FontAwesomeIcons.euroSign,['evernote']:FontAwesomeIcons.evernote,['exclamation']:FontAwesomeIcons.exclamation,['expand']:FontAwesomeIcons.expand,['expeditedssl']:FontAwesomeIcons.expeditedssl,['explosion']:FontAwesomeIcons.explosion,['solidEye']:FontAwesomeIcons.solidEye,['eye']:FontAwesomeIcons.eye,['eyeDropper']:FontAwesomeIcons.eyeDropper,['eyeLowVision']:FontAwesomeIcons.eyeLowVision,['solidEyeSlash']:FontAwesomeIcons.solidEyeSlash,['eyeSlash']:FontAwesomeIcons.eyeSlash,['f']:FontAwesomeIcons.f,['solidFaceAngry']:FontAwesomeIcons.solidFaceAngry,['faceAngry']:FontAwesomeIcons.faceAngry,['solidFaceDizzy']:FontAwesomeIcons.solidFaceDizzy,['faceDizzy']:FontAwesomeIcons.faceDizzy,['solidFaceFlushed']:FontAwesomeIcons.solidFaceFlushed,['faceFlushed']:FontAwesomeIcons.faceFlushed,['solidFaceFrown']:FontAwesomeIcons.solidFaceFrown,['faceFrown']:FontAwesomeIcons.faceFrown,['solidFaceFrownOpen']:FontAwesomeIcons.solidFaceFrownOpen,['faceFrownOpen']:FontAwesomeIcons.faceFrownOpen,['solidFaceGrimace']:FontAwesomeIcons.solidFaceGrimace,['faceGrimace']:FontAwesomeIcons.faceGrimace,['solidFaceGrin']:FontAwesomeIcons.solidFaceGrin,['faceGrin']:FontAwesomeIcons.faceGrin,['solidFaceGrinBeam']:FontAwesomeIcons.solidFaceGrinBeam,['faceGrinBeam']:FontAwesomeIcons.faceGrinBeam,['solidFaceGrinBeamSweat']:FontAwesomeIcons.solidFaceGrinBeamSweat,['faceGrinBeamSweat']:FontAwesomeIcons.faceGrinBeamSweat,['solidFaceGrinHearts']:FontAwesomeIcons.solidFaceGrinHearts,['faceGrinHearts']:FontAwesomeIcons.faceGrinHearts,['solidFaceGrinSquint']:FontAwesomeIcons.solidFaceGrinSquint,['faceGrinSquint']:FontAwesomeIcons.faceGrinSquint,['solidFaceGrinSquintTears']:FontAwesomeIcons.solidFaceGrinSquintTears,['faceGrinSquintTears']:FontAwesomeIcons.faceGrinSquintTears,['solidFaceGrinStars']:FontAwesomeIcons.solidFaceGrinStars,['faceGrinStars']:FontAwesomeIcons.faceGrinStars,['solidFaceGrinTears']:FontAwesomeIcons.solidFaceGrinTears,['faceGrinTears']:FontAwesomeIcons.faceGrinTears,['solidFaceGrinTongue']:FontAwesomeIcons.solidFaceGrinTongue,['faceGrinTongue']:FontAwesomeIcons.faceGrinTongue,['solidFaceGrinTongueSquint']:FontAwesomeIcons.solidFaceGrinTongueSquint,['faceGrinTongueSquint']:FontAwesomeIcons.faceGrinTongueSquint,['solidFaceGrinTongueWink']:FontAwesomeIcons.solidFaceGrinTongueWink,['faceGrinTongueWink']:FontAwesomeIcons.faceGrinTongueWink,['solidFaceGrinWide']:FontAwesomeIcons.solidFaceGrinWide,['faceGrinWide']:FontAwesomeIcons.faceGrinWide,['solidFaceGrinWink']:FontAwesomeIcons.solidFaceGrinWink,['faceGrinWink']:FontAwesomeIcons.faceGrinWink,['solidFaceKiss']:FontAwesomeIcons.solidFaceKiss,['faceKiss']:FontAwesomeIcons.faceKiss,['solidFaceKissBeam']:FontAwesomeIcons.solidFaceKissBeam,['faceKissBeam']:FontAwesomeIcons.faceKissBeam,['solidFaceKissWinkHeart']:FontAwesomeIcons.solidFaceKissWinkHeart,['faceKissWinkHeart']:FontAwesomeIcons.faceKissWinkHeart,['solidFaceLaugh']:FontAwesomeIcons.solidFaceLaugh,['faceLaugh']:FontAwesomeIcons.faceLaugh,['solidFaceLaughBeam']:FontAwesomeIcons.solidFaceLaughBeam,['faceLaughBeam']:FontAwesomeIcons.faceLaughBeam,['solidFaceLaughSquint']:FontAwesomeIcons.solidFaceLaughSquint,['faceLaughSquint']:FontAwesomeIcons.faceLaughSquint,['solidFaceLaughWink']:FontAwesomeIcons.solidFaceLaughWink,['faceLaughWink']:FontAwesomeIcons.faceLaughWink,['solidFaceMeh']:FontAwesomeIcons.solidFaceMeh,['faceMeh']:FontAwesomeIcons.faceMeh,['solidFaceMehBlank']:FontAwesomeIcons.solidFaceMehBlank,['faceMehBlank']:FontAwesomeIcons.faceMehBlank,['solidFaceRollingEyes']:FontAwesomeIcons.solidFaceRollingEyes,['faceRollingEyes']:FontAwesomeIcons.faceRollingEyes,['solidFaceSadCry']:FontAwesomeIcons.solidFaceSadCry,['faceSadCry']:FontAwesomeIcons.faceSadCry,['solidFaceSadTear']:FontAwesomeIcons.solidFaceSadTear,['faceSadTear']:FontAwesomeIcons.faceSadTear,['solidFaceSmile']:FontAwesomeIcons.solidFaceSmile,['faceSmile']:FontAwesomeIcons.faceSmile,['solidFaceSmileBeam']:FontAwesomeIcons.solidFaceSmileBeam,['faceSmileBeam']:FontAwesomeIcons.faceSmileBeam,['solidFaceSmileWink']:FontAwesomeIcons.solidFaceSmileWink,['faceSmileWink']:FontAwesomeIcons.faceSmileWink,['solidFaceSurprise']:FontAwesomeIcons.solidFaceSurprise,['faceSurprise']:FontAwesomeIcons.faceSurprise,['solidFaceTired']:FontAwesomeIcons.solidFaceTired,['faceTired']:FontAwesomeIcons.faceTired,['facebook']:FontAwesomeIcons.facebook,['facebookF']:FontAwesomeIcons.facebookF,['facebookMessenger']:FontAwesomeIcons.facebookMessenger,['fan']:FontAwesomeIcons.fan,['fantasyFlightGames']:FontAwesomeIcons.fantasyFlightGames,['faucet']:FontAwesomeIcons.faucet,['faucetDrip']:FontAwesomeIcons.faucetDrip,['fax']:FontAwesomeIcons.fax,['feather']:FontAwesomeIcons.feather,['featherPointed']:FontAwesomeIcons.featherPointed,['fedex']:FontAwesomeIcons.fedex,['fedora']:FontAwesomeIcons.fedora,['ferry']:FontAwesomeIcons.ferry,['figma']:FontAwesomeIcons.figma,['solidFile']:FontAwesomeIcons.solidFile,['file']:FontAwesomeIcons.file,['fileArrowDown']:FontAwesomeIcons.fileArrowDown,['fileArrowUp']:FontAwesomeIcons.fileArrowUp,['solidFileAudio']:FontAwesomeIcons.solidFileAudio,['fileAudio']:FontAwesomeIcons.fileAudio,['fileCircleCheck']:FontAwesomeIcons.fileCircleCheck,['fileCircleExclamation']:FontAwesomeIcons.fileCircleExclamation,['fileCircleMinus']:FontAwesomeIcons.fileCircleMinus,['fileCirclePlus']:FontAwesomeIcons.fileCirclePlus,['fileCircleQuestion']:FontAwesomeIcons.fileCircleQuestion,['fileCircleXmark']:FontAwesomeIcons.fileCircleXmark,['solidFileCode']:FontAwesomeIcons.solidFileCode,['fileCode']:FontAwesomeIcons.fileCode,['fileContract']:FontAwesomeIcons.fileContract,['fileCsv']:FontAwesomeIcons.fileCsv,['solidFileExcel']:FontAwesomeIcons.solidFileExcel,['fileExcel']:FontAwesomeIcons.fileExcel,['fileExport']:FontAwesomeIcons.fileExport,['solidFileImage']:FontAwesomeIcons.solidFileImage,['fileImage']:FontAwesomeIcons.fileImage,['fileImport']:FontAwesomeIcons.fileImport,['fileInvoice']:FontAwesomeIcons.fileInvoice,['fileInvoiceDollar']:FontAwesomeIcons.fileInvoiceDollar,['solidFileLines']:FontAwesomeIcons.solidFileLines,['fileLines']:FontAwesomeIcons.fileLines,['fileMedical']:FontAwesomeIcons.fileMedical,['solidFilePdf']:FontAwesomeIcons.solidFilePdf,['filePdf']:FontAwesomeIcons.filePdf,['filePen']:FontAwesomeIcons.filePen,['solidFilePowerpoint']:FontAwesomeIcons.solidFilePowerpoint,['filePowerpoint']:FontAwesomeIcons.filePowerpoint,['filePrescription']:FontAwesomeIcons.filePrescription,['fileShield']:FontAwesomeIcons.fileShield,['fileSignature']:FontAwesomeIcons.fileSignature,['solidFileVideo']:FontAwesomeIcons.solidFileVideo,['fileVideo']:FontAwesomeIcons.fileVideo,['fileWaveform']:FontAwesomeIcons.fileWaveform,['solidFileWord']:FontAwesomeIcons.solidFileWord,['fileWord']:FontAwesomeIcons.fileWord,['solidFileZipper']:FontAwesomeIcons.solidFileZipper,['fileZipper']:FontAwesomeIcons.fileZipper,['fill']:FontAwesomeIcons.fill,['fillDrip']:FontAwesomeIcons.fillDrip,['film']:FontAwesomeIcons.film,['filter']:FontAwesomeIcons.filter,['filterCircleDollar']:FontAwesomeIcons.filterCircleDollar,['filterCircleXmark']:FontAwesomeIcons.filterCircleXmark,['fingerprint']:FontAwesomeIcons.fingerprint,['fire']:FontAwesomeIcons.fire,['fireBurner']:FontAwesomeIcons.fireBurner,['fireExtinguisher']:FontAwesomeIcons.fireExtinguisher,['fireFlameCurved']:FontAwesomeIcons.fireFlameCurved,['fireFlameSimple']:FontAwesomeIcons.fireFlameSimple,['firefox']:FontAwesomeIcons.firefox,['firefoxBrowser']:FontAwesomeIcons.firefoxBrowser,['firstOrder']:FontAwesomeIcons.firstOrder,['firstOrderAlt']:FontAwesomeIcons.firstOrderAlt,['firstdraft']:FontAwesomeIcons.firstdraft,['fish']:FontAwesomeIcons.fish,['fishFins']:FontAwesomeIcons.fishFins,['solidFlag']:FontAwesomeIcons.solidFlag,['flag']:FontAwesomeIcons.flag,['flagCheckered']:FontAwesomeIcons.flagCheckered,['flagUsa']:FontAwesomeIcons.flagUsa,['flask']:FontAwesomeIcons.flask,['flaskVial']:FontAwesomeIcons.flaskVial,['flickr']:FontAwesomeIcons.flickr,['flipboard']:FontAwesomeIcons.flipboard,['solidFloppyDisk']:FontAwesomeIcons.solidFloppyDisk,['floppyDisk']:FontAwesomeIcons.floppyDisk,['florinSign']:FontAwesomeIcons.florinSign,['fly']:FontAwesomeIcons.fly,['solidFolder']:FontAwesomeIcons.solidFolder,['folder']:FontAwesomeIcons.folder,['solidFolderClosed']:FontAwesomeIcons.solidFolderClosed,['folderClosed']:FontAwesomeIcons.folderClosed,['folderMinus']:FontAwesomeIcons.folderMinus,['solidFolderOpen']:FontAwesomeIcons.solidFolderOpen,['folderOpen']:FontAwesomeIcons.folderOpen,['folderPlus']:FontAwesomeIcons.folderPlus,['folderTree']:FontAwesomeIcons.folderTree,['font']:FontAwesomeIcons.font,['solidFontAwesome']:FontAwesomeIcons.solidFontAwesome,['fontAwesome']:FontAwesomeIcons.fontAwesome,['brandsFontAwesome']:FontAwesomeIcons.brandsFontAwesome,['fonticons']:FontAwesomeIcons.fonticons,['fonticonsFi']:FontAwesomeIcons.fonticonsFi,['football']:FontAwesomeIcons.football,['fortAwesome']:FontAwesomeIcons.fortAwesome,['fortAwesomeAlt']:FontAwesomeIcons.fortAwesomeAlt,['forumbee']:FontAwesomeIcons.forumbee,['forward']:FontAwesomeIcons.forward,['forwardFast']:FontAwesomeIcons.forwardFast,['forwardStep']:FontAwesomeIcons.forwardStep,['foursquare']:FontAwesomeIcons.foursquare,['francSign']:FontAwesomeIcons.francSign,['freeCodeCamp']:FontAwesomeIcons.freeCodeCamp,['freebsd']:FontAwesomeIcons.freebsd,['frog']:FontAwesomeIcons.frog,['fulcrum']:FontAwesomeIcons.fulcrum,['solidFutbol']:FontAwesomeIcons.solidFutbol,['futbol']:FontAwesomeIcons.futbol,['g']:FontAwesomeIcons.g,['galacticRepublic']:FontAwesomeIcons.galacticRepublic,['galacticSenate']:FontAwesomeIcons.galacticSenate,['gamepad']:FontAwesomeIcons.gamepad,['gasPump']:FontAwesomeIcons.gasPump,['gauge']:FontAwesomeIcons.gauge,['gaugeHigh']:FontAwesomeIcons.gaugeHigh,['gaugeSimple']:FontAwesomeIcons.gaugeSimple,['gaugeSimpleHigh']:FontAwesomeIcons.gaugeSimpleHigh,['gavel']:FontAwesomeIcons.gavel,['gear']:FontAwesomeIcons.gear,['gears']:FontAwesomeIcons.gears,['solidGem']:FontAwesomeIcons.solidGem,['gem']:FontAwesomeIcons.gem,['genderless']:FontAwesomeIcons.genderless,['getPocket']:FontAwesomeIcons.getPocket,['gg']:FontAwesomeIcons.gg,['ggCircle']:FontAwesomeIcons.ggCircle,['ghost']:FontAwesomeIcons.ghost,['gift']:FontAwesomeIcons.gift,['gifts']:FontAwesomeIcons.gifts,['git']:FontAwesomeIcons.git,['gitAlt']:FontAwesomeIcons.gitAlt,['github']:FontAwesomeIcons.github,['githubAlt']:FontAwesomeIcons.githubAlt,['gitkraken']:FontAwesomeIcons.gitkraken,['gitlab']:FontAwesomeIcons.gitlab,['gitter']:FontAwesomeIcons.gitter,['glassWater']:FontAwesomeIcons.glassWater,['glassWaterDroplet']:FontAwesomeIcons.glassWaterDroplet,['glasses']:FontAwesomeIcons.glasses,['glide']:FontAwesomeIcons.glide,['glideG']:FontAwesomeIcons.glideG,['globe']:FontAwesomeIcons.globe,['gofore']:FontAwesomeIcons.gofore,['golang']:FontAwesomeIcons.golang,['golfBallTee']:FontAwesomeIcons.golfBallTee,['goodreads']:FontAwesomeIcons.goodreads,['goodreadsG']:FontAwesomeIcons.goodreadsG,['google']:FontAwesomeIcons.google,['googleDrive']:FontAwesomeIcons.googleDrive,['googlePay']:FontAwesomeIcons.googlePay,['googlePlay']:FontAwesomeIcons.googlePlay,['googlePlus']:FontAwesomeIcons.googlePlus,['googlePlusG']:FontAwesomeIcons.googlePlusG,['googleWallet']:FontAwesomeIcons.googleWallet,['gopuram']:FontAwesomeIcons.gopuram,['graduationCap']:FontAwesomeIcons.graduationCap,['gratipay']:FontAwesomeIcons.gratipay,['grav']:FontAwesomeIcons.grav,['greaterThan']:FontAwesomeIcons.greaterThan,['greaterThanEqual']:FontAwesomeIcons.greaterThanEqual,['grip']:FontAwesomeIcons.grip,['gripLines']:FontAwesomeIcons.gripLines,['gripLinesVertical']:FontAwesomeIcons.gripLinesVertical,['gripVertical']:FontAwesomeIcons.gripVertical,['gripfire']:FontAwesomeIcons.gripfire,['groupArrowsRotate']:FontAwesomeIcons.groupArrowsRotate,['grunt']:FontAwesomeIcons.grunt,['guaraniSign']:FontAwesomeIcons.guaraniSign,['guilded']:FontAwesomeIcons.guilded,['guitar']:FontAwesomeIcons.guitar,['gulp']:FontAwesomeIcons.gulp,['gun']:FontAwesomeIcons.gun,['h']:FontAwesomeIcons.h,['hackerNews']:FontAwesomeIcons.hackerNews,['hackerrank']:FontAwesomeIcons.hackerrank,['hammer']:FontAwesomeIcons.hammer,['hamsa']:FontAwesomeIcons.hamsa,['solidHand']:FontAwesomeIcons.solidHand,['hand']:FontAwesomeIcons.hand,['solidHandBackFist']:FontAwesomeIcons.solidHandBackFist,['handBackFist']:FontAwesomeIcons.handBackFist,['handDots']:FontAwesomeIcons.handDots,['handFist']:FontAwesomeIcons.handFist,['handHolding']:FontAwesomeIcons.handHolding,['handHoldingDollar']:FontAwesomeIcons.handHoldingDollar,['handHoldingDroplet']:FontAwesomeIcons.handHoldingDroplet,['handHoldingHand']:FontAwesomeIcons.handHoldingHand,['handHoldingHeart']:FontAwesomeIcons.handHoldingHeart,['handHoldingMedical']:FontAwesomeIcons.handHoldingMedical,['solidHandLizard']:FontAwesomeIcons.solidHandLizard,['handLizard']:FontAwesomeIcons.handLizard,['handMiddleFinger']:FontAwesomeIcons.handMiddleFinger,['solidHandPeace']:FontAwesomeIcons.solidHandPeace,['handPeace']:FontAwesomeIcons.handPeace,['solidHandPointDown']:FontAwesomeIcons.solidHandPointDown,['handPointDown']:FontAwesomeIcons.handPointDown,['solidHandPointLeft']:FontAwesomeIcons.solidHandPointLeft,['handPointLeft']:FontAwesomeIcons.handPointLeft,['solidHandPointRight']:FontAwesomeIcons.solidHandPointRight,['handPointRight']:FontAwesomeIcons.handPointRight,['solidHandPointUp']:FontAwesomeIcons.solidHandPointUp,['handPointUp']:FontAwesomeIcons.handPointUp,['solidHandPointer']:FontAwesomeIcons.solidHandPointer,['handPointer']:FontAwesomeIcons.handPointer,['solidHandScissors']:FontAwesomeIcons.solidHandScissors,['handScissors']:FontAwesomeIcons.handScissors,['handSparkles']:FontAwesomeIcons.handSparkles,['solidHandSpock']:FontAwesomeIcons.solidHandSpock,['handSpock']:FontAwesomeIcons.handSpock,['handcuffs']:FontAwesomeIcons.handcuffs,['hands']:FontAwesomeIcons.hands,['handsAslInterpreting']:FontAwesomeIcons.handsAslInterpreting,['handsBound']:FontAwesomeIcons.handsBound,['handsBubbles']:FontAwesomeIcons.handsBubbles,['handsClapping']:FontAwesomeIcons.handsClapping,['handsHolding']:FontAwesomeIcons.handsHolding,['handsHoldingChild']:FontAwesomeIcons.handsHoldingChild,['handsHoldingCircle']:FontAwesomeIcons.handsHoldingCircle,['handsPraying']:FontAwesomeIcons.handsPraying,['solidHandshake']:FontAwesomeIcons.solidHandshake,['handshake']:FontAwesomeIcons.handshake,['handshakeAngle']:FontAwesomeIcons.handshakeAngle,['handshakeSimple']:FontAwesomeIcons.handshakeSimple,['handshakeSimpleSlash']:FontAwesomeIcons.handshakeSimpleSlash,['handshakeSlash']:FontAwesomeIcons.handshakeSlash,['hanukiah']:FontAwesomeIcons.hanukiah,['solidHardDrive']:FontAwesomeIcons.solidHardDrive,['hardDrive']:FontAwesomeIcons.hardDrive,['hashnode']:FontAwesomeIcons.hashnode,['hashtag']:FontAwesomeIcons.hashtag,['hatCowboy']:FontAwesomeIcons.hatCowboy,['hatCowboySide']:FontAwesomeIcons.hatCowboySide,['hatWizard']:FontAwesomeIcons.hatWizard,['headSideCough']:FontAwesomeIcons.headSideCough,['headSideCoughSlash']:FontAwesomeIcons.headSideCoughSlash,['headSideMask']:FontAwesomeIcons.headSideMask,['headSideVirus']:FontAwesomeIcons.headSideVirus,['heading']:FontAwesomeIcons.heading,['headphones']:FontAwesomeIcons.headphones,['headphonesSimple']:FontAwesomeIcons.headphonesSimple,['headset']:FontAwesomeIcons.headset,['solidHeart']:FontAwesomeIcons.solidHeart,['heart']:FontAwesomeIcons.heart,['heartCircleBolt']:FontAwesomeIcons.heartCircleBolt,['heartCircleCheck']:FontAwesomeIcons.heartCircleCheck,['heartCircleExclamation']:FontAwesomeIcons.heartCircleExclamation,['heartCircleMinus']:FontAwesomeIcons.heartCircleMinus,['heartCirclePlus']:FontAwesomeIcons.heartCirclePlus,['heartCircleXmark']:FontAwesomeIcons.heartCircleXmark,['heartCrack']:FontAwesomeIcons.heartCrack,['heartPulse']:FontAwesomeIcons.heartPulse,['helicopter']:FontAwesomeIcons.helicopter,['helicopterSymbol']:FontAwesomeIcons.helicopterSymbol,['helmetSafety']:FontAwesomeIcons.helmetSafety,['helmetUn']:FontAwesomeIcons.helmetUn,['highlighter']:FontAwesomeIcons.highlighter,['hillAvalanche']:FontAwesomeIcons.hillAvalanche,['hillRockslide']:FontAwesomeIcons.hillRockslide,['hippo']:FontAwesomeIcons.hippo,['hips']:FontAwesomeIcons.hips,['hireAHelper']:FontAwesomeIcons.hireAHelper,['hive']:FontAwesomeIcons.hive,['hockeyPuck']:FontAwesomeIcons.hockeyPuck,['hollyBerry']:FontAwesomeIcons.hollyBerry,['hooli']:FontAwesomeIcons.hooli,['hornbill']:FontAwesomeIcons.hornbill,['horse']:FontAwesomeIcons.horse,['horseHead']:FontAwesomeIcons.horseHead,['solidHospital']:FontAwesomeIcons.solidHospital,['hospital']:FontAwesomeIcons.hospital,['hospitalUser']:FontAwesomeIcons.hospitalUser,['hotTubPerson']:FontAwesomeIcons.hotTubPerson,['hotdog']:FontAwesomeIcons.hotdog,['hotel']:FontAwesomeIcons.hotel,['hotjar']:FontAwesomeIcons.hotjar,['solidHourglass']:FontAwesomeIcons.solidHourglass,['hourglass']:FontAwesomeIcons.hourglass,['hourglassEnd']:FontAwesomeIcons.hourglassEnd,['solidHourglassHalf']:FontAwesomeIcons.solidHourglassHalf,['hourglassHalf']:FontAwesomeIcons.hourglassHalf,['hourglassStart']:FontAwesomeIcons.hourglassStart,['house']:FontAwesomeIcons.house,['houseChimney']:FontAwesomeIcons.houseChimney,['houseChimneyCrack']:FontAwesomeIcons.houseChimneyCrack,['houseChimneyMedical']:FontAwesomeIcons.houseChimneyMedical,['houseChimneyUser']:FontAwesomeIcons.houseChimneyUser,['houseChimneyWindow']:FontAwesomeIcons.houseChimneyWindow,['houseCircleCheck']:FontAwesomeIcons.houseCircleCheck,['houseCircleExclamation']:FontAwesomeIcons.houseCircleExclamation,['houseCircleXmark']:FontAwesomeIcons.houseCircleXmark,['houseCrack']:FontAwesomeIcons.houseCrack,['houseFire']:FontAwesomeIcons.houseFire,['houseFlag']:FontAwesomeIcons.houseFlag,['houseFloodWater']:FontAwesomeIcons.houseFloodWater,['houseFloodWaterCircleArrowRight']:FontAwesomeIcons.houseFloodWaterCircleArrowRight,['houseLaptop']:FontAwesomeIcons.houseLaptop,['houseLock']:FontAwesomeIcons.houseLock,['houseMedical']:FontAwesomeIcons.houseMedical,['houseMedicalCircleCheck']:FontAwesomeIcons.houseMedicalCircleCheck,['houseMedicalCircleExclamation']:FontAwesomeIcons.houseMedicalCircleExclamation,['houseMedicalCircleXmark']:FontAwesomeIcons.houseMedicalCircleXmark,['houseMedicalFlag']:FontAwesomeIcons.houseMedicalFlag,['houseSignal']:FontAwesomeIcons.houseSignal,['houseTsunami']:FontAwesomeIcons.houseTsunami,['houseUser']:FontAwesomeIcons.houseUser,['houzz']:FontAwesomeIcons.houzz,['hryvniaSign']:FontAwesomeIcons.hryvniaSign,['html5']:FontAwesomeIcons.html5,['hubspot']:FontAwesomeIcons.hubspot,['hurricane']:FontAwesomeIcons.hurricane,['i']:FontAwesomeIcons.i,['iCursor']:FontAwesomeIcons.iCursor,['iceCream']:FontAwesomeIcons.iceCream,['icicles']:FontAwesomeIcons.icicles,['icons']:FontAwesomeIcons.icons,['solidIdBadge']:FontAwesomeIcons.solidIdBadge,['idBadge']:FontAwesomeIcons.idBadge,['solidIdCard']:FontAwesomeIcons.solidIdCard,['idCard']:FontAwesomeIcons.idCard,['idCardClip']:FontAwesomeIcons.idCardClip,['ideal']:FontAwesomeIcons.ideal,['igloo']:FontAwesomeIcons.igloo,['solidImage']:FontAwesomeIcons.solidImage,['image']:FontAwesomeIcons.image,['imagePortrait']:FontAwesomeIcons.imagePortrait,['solidImages']:FontAwesomeIcons.solidImages,['images']:FontAwesomeIcons.images,['imdb']:FontAwesomeIcons.imdb,['inbox']:FontAwesomeIcons.inbox,['indent']:FontAwesomeIcons.indent,['indianRupeeSign']:FontAwesomeIcons.indianRupeeSign,['industry']:FontAwesomeIcons.industry,['infinity']:FontAwesomeIcons.infinity,['info']:FontAwesomeIcons.info,['instagram']:FontAwesomeIcons.instagram,['instalod']:FontAwesomeIcons.instalod,['intercom']:FontAwesomeIcons.intercom,['internetExplorer']:FontAwesomeIcons.internetExplorer,['invision']:FontAwesomeIcons.invision,['ioxhost']:FontAwesomeIcons.ioxhost,['italic']:FontAwesomeIcons.italic,['itchIo']:FontAwesomeIcons.itchIo,['itunes']:FontAwesomeIcons.itunes,['itunesNote']:FontAwesomeIcons.itunesNote,['j']:FontAwesomeIcons.j,['jar']:FontAwesomeIcons.jar,['jarWheat']:FontAwesomeIcons.jarWheat,['java']:FontAwesomeIcons.java,['jedi']:FontAwesomeIcons.jedi,['jediOrder']:FontAwesomeIcons.jediOrder,['jenkins']:FontAwesomeIcons.jenkins,['jetFighter']:FontAwesomeIcons.jetFighter,['jetFighterUp']:FontAwesomeIcons.jetFighterUp,['jira']:FontAwesomeIcons.jira,['joget']:FontAwesomeIcons.joget,['joint']:FontAwesomeIcons.joint,['joomla']:FontAwesomeIcons.joomla,['js']:FontAwesomeIcons.js,['jsfiddle']:FontAwesomeIcons.jsfiddle,['jugDetergent']:FontAwesomeIcons.jugDetergent,['k']:FontAwesomeIcons.k,['kaaba']:FontAwesomeIcons.kaaba,['kaggle']:FontAwesomeIcons.kaggle,['key']:FontAwesomeIcons.key,['keybase']:FontAwesomeIcons.keybase,['solidKeyboard']:FontAwesomeIcons.solidKeyboard,['keyboard']:FontAwesomeIcons.keyboard,['keycdn']:FontAwesomeIcons.keycdn,['khanda']:FontAwesomeIcons.khanda,['kickstarter']:FontAwesomeIcons.kickstarter,['kickstarterK']:FontAwesomeIcons.kickstarterK,['kipSign']:FontAwesomeIcons.kipSign,['kitMedical']:FontAwesomeIcons.kitMedical,['kitchenSet']:FontAwesomeIcons.kitchenSet,['kiwiBird']:FontAwesomeIcons.kiwiBird,['korvue']:FontAwesomeIcons.korvue,['l']:FontAwesomeIcons.l,['landMineOn']:FontAwesomeIcons.landMineOn,['landmark']:FontAwesomeIcons.landmark,['landmarkDome']:FontAwesomeIcons.landmarkDome,['landmarkFlag']:FontAwesomeIcons.landmarkFlag,['language']:FontAwesomeIcons.language,['laptop']:FontAwesomeIcons.laptop,['laptopCode']:FontAwesomeIcons.laptopCode,['laptopFile']:FontAwesomeIcons.laptopFile,['laptopMedical']:FontAwesomeIcons.laptopMedical,['laravel']:FontAwesomeIcons.laravel,['lariSign']:FontAwesomeIcons.lariSign,['lastfm']:FontAwesomeIcons.lastfm,['layerGroup']:FontAwesomeIcons.layerGroup,['leaf']:FontAwesomeIcons.leaf,['leanpub']:FontAwesomeIcons.leanpub,['leftLong']:FontAwesomeIcons.leftLong,['leftRight']:FontAwesomeIcons.leftRight,['solidLemon']:FontAwesomeIcons.solidLemon,['lemon']:FontAwesomeIcons.lemon,['less']:FontAwesomeIcons.less,['lessThan']:FontAwesomeIcons.lessThan,['lessThanEqual']:FontAwesomeIcons.lessThanEqual,['solidLifeRing']:FontAwesomeIcons.solidLifeRing,['lifeRing']:FontAwesomeIcons.lifeRing,['solidLightbulb']:FontAwesomeIcons.solidLightbulb,['lightbulb']:FontAwesomeIcons.lightbulb,['line']:FontAwesomeIcons.line,['linesLeaning']:FontAwesomeIcons.linesLeaning,['link']:FontAwesomeIcons.link,['linkSlash']:FontAwesomeIcons.linkSlash,['linkedin']:FontAwesomeIcons.linkedin,['linkedinIn']:FontAwesomeIcons.linkedinIn,['linode']:FontAwesomeIcons.linode,['linux']:FontAwesomeIcons.linux,['liraSign']:FontAwesomeIcons.liraSign,['list']:FontAwesomeIcons.list,['listCheck']:FontAwesomeIcons.listCheck,['listOl']:FontAwesomeIcons.listOl,['listUl']:FontAwesomeIcons.listUl,['litecoinSign']:FontAwesomeIcons.litecoinSign,['locationArrow']:FontAwesomeIcons.locationArrow,['locationCrosshairs']:FontAwesomeIcons.locationCrosshairs,['locationDot']:FontAwesomeIcons.locationDot,['locationPin']:FontAwesomeIcons.locationPin,['locationPinLock']:FontAwesomeIcons.locationPinLock,['lock']:FontAwesomeIcons.lock,['lockOpen']:FontAwesomeIcons.lockOpen,['locust']:FontAwesomeIcons.locust,['lungs']:FontAwesomeIcons.lungs,['lungsVirus']:FontAwesomeIcons.lungsVirus,['lyft']:FontAwesomeIcons.lyft,['m']:FontAwesomeIcons.m,['magento']:FontAwesomeIcons.magento,['magnet']:FontAwesomeIcons.magnet,['magnifyingGlass']:FontAwesomeIcons.magnifyingGlass,['magnifyingGlassArrowRight']:FontAwesomeIcons.magnifyingGlassArrowRight,['magnifyingGlassChart']:FontAwesomeIcons.magnifyingGlassChart,['magnifyingGlassDollar']:FontAwesomeIcons.magnifyingGlassDollar,['magnifyingGlassLocation']:FontAwesomeIcons.magnifyingGlassLocation,['magnifyingGlassMinus']:FontAwesomeIcons.magnifyingGlassMinus,['magnifyingGlassPlus']:FontAwesomeIcons.magnifyingGlassPlus,['mailchimp']:FontAwesomeIcons.mailchimp,['manatSign']:FontAwesomeIcons.manatSign,['mandalorian']:FontAwesomeIcons.mandalorian,['solidMap']:FontAwesomeIcons.solidMap,['map']:FontAwesomeIcons.map,['mapLocation']:FontAwesomeIcons.mapLocation,['mapLocationDot']:FontAwesomeIcons.mapLocationDot,['mapPin']:FontAwesomeIcons.mapPin,['markdown']:FontAwesomeIcons.markdown,['marker']:FontAwesomeIcons.marker,['mars']:FontAwesomeIcons.mars,['marsAndVenus']:FontAwesomeIcons.marsAndVenus,['marsAndVenusBurst']:FontAwesomeIcons.marsAndVenusBurst,['marsDouble']:FontAwesomeIcons.marsDouble,['marsStroke']:FontAwesomeIcons.marsStroke,['marsStrokeRight']:FontAwesomeIcons.marsStrokeRight,['marsStrokeUp']:FontAwesomeIcons.marsStrokeUp,['martiniGlass']:FontAwesomeIcons.martiniGlass,['martiniGlassCitrus']:FontAwesomeIcons.martiniGlassCitrus,['martiniGlassEmpty']:FontAwesomeIcons.martiniGlassEmpty,['mask']:FontAwesomeIcons.mask,['maskFace']:FontAwesomeIcons.maskFace,['maskVentilator']:FontAwesomeIcons.maskVentilator,['masksTheater']:FontAwesomeIcons.masksTheater,['mastodon']:FontAwesomeIcons.mastodon,['mattressPillow']:FontAwesomeIcons.mattressPillow,['maxcdn']:FontAwesomeIcons.maxcdn,['maximize']:FontAwesomeIcons.maximize,['mdb']:FontAwesomeIcons.mdb,['medal']:FontAwesomeIcons.medal,['medapps']:FontAwesomeIcons.medapps,['medium']:FontAwesomeIcons.medium,['medrt']:FontAwesomeIcons.medrt,['meetup']:FontAwesomeIcons.meetup,['megaport']:FontAwesomeIcons.megaport,['memory']:FontAwesomeIcons.memory,['mendeley']:FontAwesomeIcons.mendeley,['menorah']:FontAwesomeIcons.menorah,['mercury']:FontAwesomeIcons.mercury,['solidMessage']:FontAwesomeIcons.solidMessage,['message']:FontAwesomeIcons.message,['meta']:FontAwesomeIcons.meta,['meteor']:FontAwesomeIcons.meteor,['microblog']:FontAwesomeIcons.microblog,['microchip']:FontAwesomeIcons.microchip,['microphone']:FontAwesomeIcons.microphone,['microphoneLines']:FontAwesomeIcons.microphoneLines,['microphoneLinesSlash']:FontAwesomeIcons.microphoneLinesSlash,['microphoneSlash']:FontAwesomeIcons.microphoneSlash,['microscope']:FontAwesomeIcons.microscope,['microsoft']:FontAwesomeIcons.microsoft,['millSign']:FontAwesomeIcons.millSign,['minimize']:FontAwesomeIcons.minimize,['minus']:FontAwesomeIcons.minus,['mitten']:FontAwesomeIcons.mitten,['mix']:FontAwesomeIcons.mix,['mixcloud']:FontAwesomeIcons.mixcloud,['mixer']:FontAwesomeIcons.mixer,['mizuni']:FontAwesomeIcons.mizuni,['mobile']:FontAwesomeIcons.mobile,['mobileButton']:FontAwesomeIcons.mobileButton,['mobileRetro']:FontAwesomeIcons.mobileRetro,['mobileScreen']:FontAwesomeIcons.mobileScreen,['mobileScreenButton']:FontAwesomeIcons.mobileScreenButton,['modx']:FontAwesomeIcons.modx,['monero']:FontAwesomeIcons.monero,['moneyBill']:FontAwesomeIcons.moneyBill,['solidMoneyBill1']:FontAwesomeIcons.solidMoneyBill1,['moneyBill1']:FontAwesomeIcons.moneyBill1,['moneyBill1Wave']:FontAwesomeIcons.moneyBill1Wave,['moneyBillTransfer']:FontAwesomeIcons.moneyBillTransfer,['moneyBillTrendUp']:FontAwesomeIcons.moneyBillTrendUp,['moneyBillWave']:FontAwesomeIcons.moneyBillWave,['moneyBillWheat']:FontAwesomeIcons.moneyBillWheat,['moneyBills']:FontAwesomeIcons.moneyBills,['moneyCheck']:FontAwesomeIcons.moneyCheck,['moneyCheckDollar']:FontAwesomeIcons.moneyCheckDollar,['monument']:FontAwesomeIcons.monument,['solidMoon']:FontAwesomeIcons.solidMoon,['moon']:FontAwesomeIcons.moon,['mortarPestle']:FontAwesomeIcons.mortarPestle,['mosque']:FontAwesomeIcons.mosque,['mosquito']:FontAwesomeIcons.mosquito,['mosquitoNet']:FontAwesomeIcons.mosquitoNet,['motorcycle']:FontAwesomeIcons.motorcycle,['mound']:FontAwesomeIcons.mound,['mountain']:FontAwesomeIcons.mountain,['mountainCity']:FontAwesomeIcons.mountainCity,['mountainSun']:FontAwesomeIcons.mountainSun,['mugHot']:FontAwesomeIcons.mugHot,['mugSaucer']:FontAwesomeIcons.mugSaucer,['music']:FontAwesomeIcons.music,['n']:FontAwesomeIcons.n,['nairaSign']:FontAwesomeIcons.nairaSign,['napster']:FontAwesomeIcons.napster,['neos']:FontAwesomeIcons.neos,['networkWired']:FontAwesomeIcons.networkWired,['neuter']:FontAwesomeIcons.neuter,['solidNewspaper']:FontAwesomeIcons.solidNewspaper,['newspaper']:FontAwesomeIcons.newspaper,['nfcDirectional']:FontAwesomeIcons.nfcDirectional,['nfcSymbol']:FontAwesomeIcons.nfcSymbol,['nimblr']:FontAwesomeIcons.nimblr,['node']:FontAwesomeIcons.node,['nodeJs']:FontAwesomeIcons.nodeJs,['notEqual']:FontAwesomeIcons.notEqual,['notdef']:FontAwesomeIcons.notdef,['solidNoteSticky']:FontAwesomeIcons.solidNoteSticky,['noteSticky']:FontAwesomeIcons.noteSticky,['notesMedical']:FontAwesomeIcons.notesMedical,['npm']:FontAwesomeIcons.npm,['ns8']:FontAwesomeIcons.ns8,['nutritionix']:FontAwesomeIcons.nutritionix,['o']:FontAwesomeIcons.o,['solidObjectGroup']:FontAwesomeIcons.solidObjectGroup,['objectGroup']:FontAwesomeIcons.objectGroup,['solidObjectUngroup']:FontAwesomeIcons.solidObjectUngroup,['objectUngroup']:FontAwesomeIcons.objectUngroup,['octopusDeploy']:FontAwesomeIcons.octopusDeploy,['odnoklassniki']:FontAwesomeIcons.odnoklassniki,['odysee']:FontAwesomeIcons.odysee,['oilCan']:FontAwesomeIcons.oilCan,['oilWell']:FontAwesomeIcons.oilWell,['oldRepublic']:FontAwesomeIcons.oldRepublic,['om']:FontAwesomeIcons.om,['opencart']:FontAwesomeIcons.opencart,['openid']:FontAwesomeIcons.openid,['opera']:FontAwesomeIcons.opera,['optinMonster']:FontAwesomeIcons.optinMonster,['orcid']:FontAwesomeIcons.orcid,['osi']:FontAwesomeIcons.osi,['otter']:FontAwesomeIcons.otter,['outdent']:FontAwesomeIcons.outdent,['p']:FontAwesomeIcons.p,['padlet']:FontAwesomeIcons.padlet,['page4']:FontAwesomeIcons.page4,['pagelines']:FontAwesomeIcons.pagelines,['pager']:FontAwesomeIcons.pager,['paintRoller']:FontAwesomeIcons.paintRoller,['paintbrush']:FontAwesomeIcons.paintbrush,['palette']:FontAwesomeIcons.palette,['palfed']:FontAwesomeIcons.palfed,['pallet']:FontAwesomeIcons.pallet,['panorama']:FontAwesomeIcons.panorama,['solidPaperPlane']:FontAwesomeIcons.solidPaperPlane,['paperPlane']:FontAwesomeIcons.paperPlane,['paperclip']:FontAwesomeIcons.paperclip,['parachuteBox']:FontAwesomeIcons.parachuteBox,['paragraph']:FontAwesomeIcons.paragraph,['passport']:FontAwesomeIcons.passport,['solidPaste']:FontAwesomeIcons.solidPaste,['paste']:FontAwesomeIcons.paste,['patreon']:FontAwesomeIcons.patreon,['pause']:FontAwesomeIcons.pause,['paw']:FontAwesomeIcons.paw,['paypal']:FontAwesomeIcons.paypal,['peace']:FontAwesomeIcons.peace,['pen']:FontAwesomeIcons.pen,['penClip']:FontAwesomeIcons.penClip,['penFancy']:FontAwesomeIcons.penFancy,['penNib']:FontAwesomeIcons.penNib,['penRuler']:FontAwesomeIcons.penRuler,['solidPenToSquare']:FontAwesomeIcons.solidPenToSquare,['penToSquare']:FontAwesomeIcons.penToSquare,['pencil']:FontAwesomeIcons.pencil,['peopleArrows']:FontAwesomeIcons.peopleArrows,['peopleCarryBox']:FontAwesomeIcons.peopleCarryBox,['peopleGroup']:FontAwesomeIcons.peopleGroup,['peopleLine']:FontAwesomeIcons.peopleLine,['peoplePulling']:FontAwesomeIcons.peoplePulling,['peopleRobbery']:FontAwesomeIcons.peopleRobbery,['peopleRoof']:FontAwesomeIcons.peopleRoof,['pepperHot']:FontAwesomeIcons.pepperHot,['perbyte']:FontAwesomeIcons.perbyte,['percent']:FontAwesomeIcons.percent,['periscope']:FontAwesomeIcons.periscope,['person']:FontAwesomeIcons.person,['personArrowDownToLine']:FontAwesomeIcons.personArrowDownToLine,['personArrowUpFromLine']:FontAwesomeIcons.personArrowUpFromLine,['personBiking']:FontAwesomeIcons.personBiking,['personBooth']:FontAwesomeIcons.personBooth,['personBreastfeeding']:FontAwesomeIcons.personBreastfeeding,['personBurst']:FontAwesomeIcons.personBurst,['personCane']:FontAwesomeIcons.personCane,['personChalkboard']:FontAwesomeIcons.personChalkboard,['personCircleCheck']:FontAwesomeIcons.personCircleCheck,['personCircleExclamation']:FontAwesomeIcons.personCircleExclamation,['personCircleMinus']:FontAwesomeIcons.personCircleMinus,['personCirclePlus']:FontAwesomeIcons.personCirclePlus,['personCircleQuestion']:FontAwesomeIcons.personCircleQuestion,['personCircleXmark']:FontAwesomeIcons.personCircleXmark,['personDigging']:FontAwesomeIcons.personDigging,['personDotsFromLine']:FontAwesomeIcons.personDotsFromLine,['personDress']:FontAwesomeIcons.personDress,['personDressBurst']:FontAwesomeIcons.personDressBurst,['personDrowning']:FontAwesomeIcons.personDrowning,['personFalling']:FontAwesomeIcons.personFalling,['personFallingBurst']:FontAwesomeIcons.personFallingBurst,['personHalfDress']:FontAwesomeIcons.personHalfDress,['personHarassing']:FontAwesomeIcons.personHarassing,['personHiking']:FontAwesomeIcons.personHiking,['personMilitaryPointing']:FontAwesomeIcons.personMilitaryPointing,['personMilitaryRifle']:FontAwesomeIcons.personMilitaryRifle,['personMilitaryToPerson']:FontAwesomeIcons.personMilitaryToPerson,['personPraying']:FontAwesomeIcons.personPraying,['personPregnant']:FontAwesomeIcons.personPregnant,['personRays']:FontAwesomeIcons.personRays,['personRifle']:FontAwesomeIcons.personRifle,['personRunning']:FontAwesomeIcons.personRunning,['personShelter']:FontAwesomeIcons.personShelter,['personSkating']:FontAwesomeIcons.personSkating,['personSkiing']:FontAwesomeIcons.personSkiing,['personSkiingNordic']:FontAwesomeIcons.personSkiingNordic,['personSnowboarding']:FontAwesomeIcons.personSnowboarding,['personSwimming']:FontAwesomeIcons.personSwimming,['personThroughWindow']:FontAwesomeIcons.personThroughWindow,['personWalking']:FontAwesomeIcons.personWalking,['personWalkingArrowLoopLeft']:FontAwesomeIcons.personWalkingArrowLoopLeft,['personWalkingArrowRight']:FontAwesomeIcons.personWalkingArrowRight,['personWalkingDashedLineArrowRight']:FontAwesomeIcons.personWalkingDashedLineArrowRight,['personWalkingLuggage']:FontAwesomeIcons.personWalkingLuggage,['personWalkingWithCane']:FontAwesomeIcons.personWalkingWithCane,['pesetaSign']:FontAwesomeIcons.pesetaSign,['pesoSign']:FontAwesomeIcons.pesoSign,['phabricator']:FontAwesomeIcons.phabricator,['phoenixFramework']:FontAwesomeIcons.phoenixFramework,['phoenixSquadron']:FontAwesomeIcons.phoenixSquadron,['phone']:FontAwesomeIcons.phone,['phoneFlip']:FontAwesomeIcons.phoneFlip,['phoneSlash']:FontAwesomeIcons.phoneSlash,['phoneVolume']:FontAwesomeIcons.phoneVolume,['photoFilm']:FontAwesomeIcons.photoFilm,['php']:FontAwesomeIcons.php,['piedPiper']:FontAwesomeIcons.piedPiper,['piedPiperAlt']:FontAwesomeIcons.piedPiperAlt,['piedPiperHat']:FontAwesomeIcons.piedPiperHat,['piedPiperPp']:FontAwesomeIcons.piedPiperPp,['piggyBank']:FontAwesomeIcons.piggyBank,['pills']:FontAwesomeIcons.pills,['pinterest']:FontAwesomeIcons.pinterest,['pinterestP']:FontAwesomeIcons.pinterestP,['pix']:FontAwesomeIcons.pix,['pizzaSlice']:FontAwesomeIcons.pizzaSlice,['placeOfWorship']:FontAwesomeIcons.placeOfWorship,['plane']:FontAwesomeIcons.plane,['planeArrival']:FontAwesomeIcons.planeArrival,['planeCircleCheck']:FontAwesomeIcons.planeCircleCheck,['planeCircleExclamation']:FontAwesomeIcons.planeCircleExclamation,['planeCircleXmark']:FontAwesomeIcons.planeCircleXmark,['planeDeparture']:FontAwesomeIcons.planeDeparture,['planeLock']:FontAwesomeIcons.planeLock,['planeSlash']:FontAwesomeIcons.planeSlash,['planeUp']:FontAwesomeIcons.planeUp,['plantWilt']:FontAwesomeIcons.plantWilt,['plateWheat']:FontAwesomeIcons.plateWheat,['play']:FontAwesomeIcons.play,['playstation']:FontAwesomeIcons.playstation,['plug']:FontAwesomeIcons.plug,['plugCircleBolt']:FontAwesomeIcons.plugCircleBolt,['plugCircleCheck']:FontAwesomeIcons.plugCircleCheck,['plugCircleExclamation']:FontAwesomeIcons.plugCircleExclamation,['plugCircleMinus']:FontAwesomeIcons.plugCircleMinus,['plugCirclePlus']:FontAwesomeIcons.plugCirclePlus,['plugCircleXmark']:FontAwesomeIcons.plugCircleXmark,['plus']:FontAwesomeIcons.plus,['plusMinus']:FontAwesomeIcons.plusMinus,['podcast']:FontAwesomeIcons.podcast,['poo']:FontAwesomeIcons.poo,['pooStorm']:FontAwesomeIcons.pooStorm,['poop']:FontAwesomeIcons.poop,['powerOff']:FontAwesomeIcons.powerOff,['prescription']:FontAwesomeIcons.prescription,['prescriptionBottle']:FontAwesomeIcons.prescriptionBottle,['prescriptionBottleMedical']:FontAwesomeIcons.prescriptionBottleMedical,['print']:FontAwesomeIcons.print,['productHunt']:FontAwesomeIcons.productHunt,['pumpMedical']:FontAwesomeIcons.pumpMedical,['pumpSoap']:FontAwesomeIcons.pumpSoap,['pushed']:FontAwesomeIcons.pushed,['puzzlePiece']:FontAwesomeIcons.puzzlePiece,['python']:FontAwesomeIcons.python,['q']:FontAwesomeIcons.q,['qq']:FontAwesomeIcons.qq,['qrcode']:FontAwesomeIcons.qrcode,['question']:FontAwesomeIcons.question,['quinscape']:FontAwesomeIcons.quinscape,['quora']:FontAwesomeIcons.quora,['quoteLeft']:FontAwesomeIcons.quoteLeft,['quoteRight']:FontAwesomeIcons.quoteRight,['r']:FontAwesomeIcons.r,['rProject']:FontAwesomeIcons.rProject,['radiation']:FontAwesomeIcons.radiation,['radio']:FontAwesomeIcons.radio,['rainbow']:FontAwesomeIcons.rainbow,['rankingStar']:FontAwesomeIcons.rankingStar,['raspberryPi']:FontAwesomeIcons.raspberryPi,['ravelry']:FontAwesomeIcons.ravelry,['react']:FontAwesomeIcons.react,['reacteurope']:FontAwesomeIcons.reacteurope,['readme']:FontAwesomeIcons.readme,['rebel']:FontAwesomeIcons.rebel,['receipt']:FontAwesomeIcons.receipt,['recordVinyl']:FontAwesomeIcons.recordVinyl,['rectangleAd']:FontAwesomeIcons.rectangleAd,['solidRectangleList']:FontAwesomeIcons.solidRectangleList,['rectangleList']:FontAwesomeIcons.rectangleList,['solidRectangleXmark']:FontAwesomeIcons.solidRectangleXmark,['rectangleXmark']:FontAwesomeIcons.rectangleXmark,['recycle']:FontAwesomeIcons.recycle,['redRiver']:FontAwesomeIcons.redRiver,['reddit']:FontAwesomeIcons.reddit,['redditAlien']:FontAwesomeIcons.redditAlien,['redhat']:FontAwesomeIcons.redhat,['solidRegistered']:FontAwesomeIcons.solidRegistered,['registered']:FontAwesomeIcons.registered,['renren']:FontAwesomeIcons.renren,['repeat']:FontAwesomeIcons.repeat,['reply']:FontAwesomeIcons.reply,['replyAll']:FontAwesomeIcons.replyAll,['replyd']:FontAwesomeIcons.replyd,['republican']:FontAwesomeIcons.republican,['researchgate']:FontAwesomeIcons.researchgate,['resolving']:FontAwesomeIcons.resolving,['restroom']:FontAwesomeIcons.restroom,['retweet']:FontAwesomeIcons.retweet,['rev']:FontAwesomeIcons.rev,['ribbon']:FontAwesomeIcons.ribbon,['rightFromBracket']:FontAwesomeIcons.rightFromBracket,['rightLeft']:FontAwesomeIcons.rightLeft,['rightLong']:FontAwesomeIcons.rightLong,['rightToBracket']:FontAwesomeIcons.rightToBracket,['ring']:FontAwesomeIcons.ring,['road']:FontAwesomeIcons.road,['roadBarrier']:FontAwesomeIcons.roadBarrier,['roadBridge']:FontAwesomeIcons.roadBridge,['roadCircleCheck']:FontAwesomeIcons.roadCircleCheck,['roadCircleExclamation']:FontAwesomeIcons.roadCircleExclamation,['roadCircleXmark']:FontAwesomeIcons.roadCircleXmark,['roadLock']:FontAwesomeIcons.roadLock,['roadSpikes']:FontAwesomeIcons.roadSpikes,['robot']:FontAwesomeIcons.robot,['rocket']:FontAwesomeIcons.rocket,['rocketchat']:FontAwesomeIcons.rocketchat,['rockrms']:FontAwesomeIcons.rockrms,['rotate']:FontAwesomeIcons.rotate,['rotateLeft']:FontAwesomeIcons.rotateLeft,['rotateRight']:FontAwesomeIcons.rotateRight,['route']:FontAwesomeIcons.route,['rss']:FontAwesomeIcons.rss,['rubleSign']:FontAwesomeIcons.rubleSign,['rug']:FontAwesomeIcons.rug,['ruler']:FontAwesomeIcons.ruler,['rulerCombined']:FontAwesomeIcons.rulerCombined,['rulerHorizontal']:FontAwesomeIcons.rulerHorizontal,['rulerVertical']:FontAwesomeIcons.rulerVertical,['rupeeSign']:FontAwesomeIcons.rupeeSign,['rupiahSign']:FontAwesomeIcons.rupiahSign,['rust']:FontAwesomeIcons.rust,['s']:FontAwesomeIcons.s,['sackDollar']:FontAwesomeIcons.sackDollar,['sackXmark']:FontAwesomeIcons.sackXmark,['safari']:FontAwesomeIcons.safari,['sailboat']:FontAwesomeIcons.sailboat,['salesforce']:FontAwesomeIcons.salesforce,['sass']:FontAwesomeIcons.sass,['satellite']:FontAwesomeIcons.satellite,['satelliteDish']:FontAwesomeIcons.satelliteDish,['scaleBalanced']:FontAwesomeIcons.scaleBalanced,['scaleUnbalanced']:FontAwesomeIcons.scaleUnbalanced,['scaleUnbalancedFlip']:FontAwesomeIcons.scaleUnbalancedFlip,['schlix']:FontAwesomeIcons.schlix,['school']:FontAwesomeIcons.school,['schoolCircleCheck']:FontAwesomeIcons.schoolCircleCheck,['schoolCircleExclamation']:FontAwesomeIcons.schoolCircleExclamation,['schoolCircleXmark']:FontAwesomeIcons.schoolCircleXmark,['schoolFlag']:FontAwesomeIcons.schoolFlag,['schoolLock']:FontAwesomeIcons.schoolLock,['scissors']:FontAwesomeIcons.scissors,['screenpal']:FontAwesomeIcons.screenpal,['screwdriver']:FontAwesomeIcons.screwdriver,['screwdriverWrench']:FontAwesomeIcons.screwdriverWrench,['scribd']:FontAwesomeIcons.scribd,['scroll']:FontAwesomeIcons.scroll,['scrollTorah']:FontAwesomeIcons.scrollTorah,['sdCard']:FontAwesomeIcons.sdCard,['searchengin']:FontAwesomeIcons.searchengin,['section']:FontAwesomeIcons.section,['seedling']:FontAwesomeIcons.seedling,['sellcast']:FontAwesomeIcons.sellcast,['sellsy']:FontAwesomeIcons.sellsy,['server']:FontAwesomeIcons.server,['servicestack']:FontAwesomeIcons.servicestack,['shapes']:FontAwesomeIcons.shapes,['share']:FontAwesomeIcons.share,['solidShareFromSquare']:FontAwesomeIcons.solidShareFromSquare,['shareFromSquare']:FontAwesomeIcons.shareFromSquare,['shareNodes']:FontAwesomeIcons.shareNodes,['sheetPlastic']:FontAwesomeIcons.sheetPlastic,['shekelSign']:FontAwesomeIcons.shekelSign,['shield']:FontAwesomeIcons.shield,['shieldCat']:FontAwesomeIcons.shieldCat,['shieldDog']:FontAwesomeIcons.shieldDog,['shieldHalved']:FontAwesomeIcons.shieldHalved,['shieldHeart']:FontAwesomeIcons.shieldHeart,['shieldVirus']:FontAwesomeIcons.shieldVirus,['ship']:FontAwesomeIcons.ship,['shirt']:FontAwesomeIcons.shirt,['shirtsinbulk']:FontAwesomeIcons.shirtsinbulk,['shoePrints']:FontAwesomeIcons.shoePrints,['shop']:FontAwesomeIcons.shop,['shopLock']:FontAwesomeIcons.shopLock,['shopSlash']:FontAwesomeIcons.shopSlash,['shopify']:FontAwesomeIcons.shopify,['shopware']:FontAwesomeIcons.shopware,['shower']:FontAwesomeIcons.shower,['shrimp']:FontAwesomeIcons.shrimp,['shuffle']:FontAwesomeIcons.shuffle,['shuttleSpace']:FontAwesomeIcons.shuttleSpace,['signHanging']:FontAwesomeIcons.signHanging,['signal']:FontAwesomeIcons.signal,['signature']:FontAwesomeIcons.signature,['signsPost']:FontAwesomeIcons.signsPost,['simCard']:FontAwesomeIcons.simCard,['simplybuilt']:FontAwesomeIcons.simplybuilt,['sink']:FontAwesomeIcons.sink,['sistrix']:FontAwesomeIcons.sistrix,['sitemap']:FontAwesomeIcons.sitemap,['sith']:FontAwesomeIcons.sith,['sitrox']:FontAwesomeIcons.sitrox,['sketch']:FontAwesomeIcons.sketch,['skull']:FontAwesomeIcons.skull,['skullCrossbones']:FontAwesomeIcons.skullCrossbones,['skyatlas']:FontAwesomeIcons.skyatlas,['skype']:FontAwesomeIcons.skype,['slack']:FontAwesomeIcons.slack,['slash']:FontAwesomeIcons.slash,['sleigh']:FontAwesomeIcons.sleigh,['sliders']:FontAwesomeIcons.sliders,['slideshare']:FontAwesomeIcons.slideshare,['smog']:FontAwesomeIcons.smog,['smoking']:FontAwesomeIcons.smoking,['snapchat']:FontAwesomeIcons.snapchat,['solidSnowflake']:FontAwesomeIcons.solidSnowflake,['snowflake']:FontAwesomeIcons.snowflake,['snowman']:FontAwesomeIcons.snowman,['snowplow']:FontAwesomeIcons.snowplow,['soap']:FontAwesomeIcons.soap,['socks']:FontAwesomeIcons.socks,['solarPanel']:FontAwesomeIcons.solarPanel,['sort']:FontAwesomeIcons.sort,['sortDown']:FontAwesomeIcons.sortDown,['sortUp']:FontAwesomeIcons.sortUp,['soundcloud']:FontAwesomeIcons.soundcloud,['sourcetree']:FontAwesomeIcons.sourcetree,['spa']:FontAwesomeIcons.spa,['spaceAwesome']:FontAwesomeIcons.spaceAwesome,['spaghettiMonsterFlying']:FontAwesomeIcons.spaghettiMonsterFlying,['speakap']:FontAwesomeIcons.speakap,['speakerDeck']:FontAwesomeIcons.speakerDeck,['spellCheck']:FontAwesomeIcons.spellCheck,['spider']:FontAwesomeIcons.spider,['spinner']:FontAwesomeIcons.spinner,['splotch']:FontAwesomeIcons.splotch,['spoon']:FontAwesomeIcons.spoon,['spotify']:FontAwesomeIcons.spotify,['sprayCan']:FontAwesomeIcons.sprayCan,['sprayCanSparkles']:FontAwesomeIcons.sprayCanSparkles,['solidSquare']:FontAwesomeIcons.solidSquare,['square']:FontAwesomeIcons.square,['squareArrowUpRight']:FontAwesomeIcons.squareArrowUpRight,['squareBehance']:FontAwesomeIcons.squareBehance,['solidSquareCaretDown']:FontAwesomeIcons.solidSquareCaretDown,['squareCaretDown']:FontAwesomeIcons.squareCaretDown,['solidSquareCaretLeft']:FontAwesomeIcons.solidSquareCaretLeft,['squareCaretLeft']:FontAwesomeIcons.squareCaretLeft,['solidSquareCaretRight']:FontAwesomeIcons.solidSquareCaretRight,['squareCaretRight']:FontAwesomeIcons.squareCaretRight,['solidSquareCaretUp']:FontAwesomeIcons.solidSquareCaretUp,['squareCaretUp']:FontAwesomeIcons.squareCaretUp,['solidSquareCheck']:FontAwesomeIcons.solidSquareCheck,['squareCheck']:FontAwesomeIcons.squareCheck,['squareDribbble']:FontAwesomeIcons.squareDribbble,['squareEnvelope']:FontAwesomeIcons.squareEnvelope,['squareFacebook']:FontAwesomeIcons.squareFacebook,['squareFontAwesome']:FontAwesomeIcons.squareFontAwesome,['squareFontAwesomeStroke']:FontAwesomeIcons.squareFontAwesomeStroke,['solidSquareFull']:FontAwesomeIcons.solidSquareFull,['squareFull']:FontAwesomeIcons.squareFull,['squareGit']:FontAwesomeIcons.squareGit,['squareGithub']:FontAwesomeIcons.squareGithub,['squareGitlab']:FontAwesomeIcons.squareGitlab,['squareGooglePlus']:FontAwesomeIcons.squareGooglePlus,['squareH']:FontAwesomeIcons.squareH,['squareHackerNews']:FontAwesomeIcons.squareHackerNews,['squareInstagram']:FontAwesomeIcons.squareInstagram,['squareJs']:FontAwesomeIcons.squareJs,['squareLastfm']:FontAwesomeIcons.squareLastfm,['solidSquareMinus']:FontAwesomeIcons.solidSquareMinus,['squareMinus']:FontAwesomeIcons.squareMinus,['squareNfi']:FontAwesomeIcons.squareNfi,['squareOdnoklassniki']:FontAwesomeIcons.squareOdnoklassniki,['squareParking']:FontAwesomeIcons.squareParking,['squarePen']:FontAwesomeIcons.squarePen,['squarePersonConfined']:FontAwesomeIcons.squarePersonConfined,['squarePhone']:FontAwesomeIcons.squarePhone,['squarePhoneFlip']:FontAwesomeIcons.squarePhoneFlip,['squarePiedPiper']:FontAwesomeIcons.squarePiedPiper,['squarePinterest']:FontAwesomeIcons.squarePinterest,['solidSquarePlus']:FontAwesomeIcons.solidSquarePlus,['squarePlus']:FontAwesomeIcons.squarePlus,['squarePollHorizontal']:FontAwesomeIcons.squarePollHorizontal,['squarePollVertical']:FontAwesomeIcons.squarePollVertical,['squareReddit']:FontAwesomeIcons.squareReddit,['squareRootVariable']:FontAwesomeIcons.squareRootVariable,['squareRss']:FontAwesomeIcons.squareRss,['squareShareNodes']:FontAwesomeIcons.squareShareNodes,['squareSnapchat']:FontAwesomeIcons.squareSnapchat,['squareSteam']:FontAwesomeIcons.squareSteam,['squareTumblr']:FontAwesomeIcons.squareTumblr,['squareTwitter']:FontAwesomeIcons.squareTwitter,['squareUpRight']:FontAwesomeIcons.squareUpRight,['squareViadeo']:FontAwesomeIcons.squareViadeo,['squareVimeo']:FontAwesomeIcons.squareVimeo,['squareVirus']:FontAwesomeIcons.squareVirus,['squareWhatsapp']:FontAwesomeIcons.squareWhatsapp,['squareXing']:FontAwesomeIcons.squareXing,['squareXmark']:FontAwesomeIcons.squareXmark,['squareYoutube']:FontAwesomeIcons.squareYoutube,['squarespace']:FontAwesomeIcons.squarespace,['stackExchange']:FontAwesomeIcons.stackExchange,['stackOverflow']:FontAwesomeIcons.stackOverflow,['stackpath']:FontAwesomeIcons.stackpath,['staffSnake']:FontAwesomeIcons.staffSnake,['stairs']:FontAwesomeIcons.stairs,['stamp']:FontAwesomeIcons.stamp,['stapler']:FontAwesomeIcons.stapler,['solidStar']:FontAwesomeIcons.solidStar,['star']:FontAwesomeIcons.star,['starAndCrescent']:FontAwesomeIcons.starAndCrescent,['solidStarHalf']:FontAwesomeIcons.solidStarHalf,['starHalf']:FontAwesomeIcons.starHalf,['solidStarHalfStroke']:FontAwesomeIcons.solidStarHalfStroke,['starHalfStroke']:FontAwesomeIcons.starHalfStroke,['starOfDavid']:FontAwesomeIcons.starOfDavid,['starOfLife']:FontAwesomeIcons.starOfLife,['staylinked']:FontAwesomeIcons.staylinked,['steam']:FontAwesomeIcons.steam,['steamSymbol']:FontAwesomeIcons.steamSymbol,['sterlingSign']:FontAwesomeIcons.sterlingSign,['stethoscope']:FontAwesomeIcons.stethoscope,['stickerMule']:FontAwesomeIcons.stickerMule,['stop']:FontAwesomeIcons.stop,['stopwatch']:FontAwesomeIcons.stopwatch,['stopwatch20']:FontAwesomeIcons.stopwatch20,['store']:FontAwesomeIcons.store,['storeSlash']:FontAwesomeIcons.storeSlash,['strava']:FontAwesomeIcons.strava,['streetView']:FontAwesomeIcons.streetView,['strikethrough']:FontAwesomeIcons.strikethrough,['stripe']:FontAwesomeIcons.stripe,['stripeS']:FontAwesomeIcons.stripeS,['stroopwafel']:FontAwesomeIcons.stroopwafel,['stubber']:FontAwesomeIcons.stubber,['studiovinari']:FontAwesomeIcons.studiovinari,['stumbleupon']:FontAwesomeIcons.stumbleupon,['stumbleuponCircle']:FontAwesomeIcons.stumbleuponCircle,['subscript']:FontAwesomeIcons.subscript,['suitcase']:FontAwesomeIcons.suitcase,['suitcaseMedical']:FontAwesomeIcons.suitcaseMedical,['suitcaseRolling']:FontAwesomeIcons.suitcaseRolling,['solidSun']:FontAwesomeIcons.solidSun,['sun']:FontAwesomeIcons.sun,['sunPlantWilt']:FontAwesomeIcons.sunPlantWilt,['superpowers']:FontAwesomeIcons.superpowers,['superscript']:FontAwesomeIcons.superscript,['supple']:FontAwesomeIcons.supple,['suse']:FontAwesomeIcons.suse,['swatchbook']:FontAwesomeIcons.swatchbook,['swift']:FontAwesomeIcons.swift,['symfony']:FontAwesomeIcons.symfony,['synagogue']:FontAwesomeIcons.synagogue,['syringe']:FontAwesomeIcons.syringe,['t']:FontAwesomeIcons.t,['table']:FontAwesomeIcons.table,['tableCells']:FontAwesomeIcons.tableCells,['tableCellsLarge']:FontAwesomeIcons.tableCellsLarge,['tableColumns']:FontAwesomeIcons.tableColumns,['tableList']:FontAwesomeIcons.tableList,['tableTennisPaddleBall']:FontAwesomeIcons.tableTennisPaddleBall,['tablet']:FontAwesomeIcons.tablet,['tabletButton']:FontAwesomeIcons.tabletButton,['tabletScreenButton']:FontAwesomeIcons.tabletScreenButton,['tablets']:FontAwesomeIcons.tablets,['tachographDigital']:FontAwesomeIcons.tachographDigital,['tag']:FontAwesomeIcons.tag,['tags']:FontAwesomeIcons.tags,['tape']:FontAwesomeIcons.tape,['tarp']:FontAwesomeIcons.tarp,['tarpDroplet']:FontAwesomeIcons.tarpDroplet,['taxi']:FontAwesomeIcons.taxi,['teamspeak']:FontAwesomeIcons.teamspeak,['teeth']:FontAwesomeIcons.teeth,['teethOpen']:FontAwesomeIcons.teethOpen,['telegram']:FontAwesomeIcons.telegram,['temperatureArrowDown']:FontAwesomeIcons.temperatureArrowDown,['temperatureArrowUp']:FontAwesomeIcons.temperatureArrowUp,['temperatureEmpty']:FontAwesomeIcons.temperatureEmpty,['temperatureFull']:FontAwesomeIcons.temperatureFull,['temperatureHalf']:FontAwesomeIcons.temperatureHalf,['temperatureHigh']:FontAwesomeIcons.temperatureHigh,['temperatureLow']:FontAwesomeIcons.temperatureLow,['temperatureQuarter']:FontAwesomeIcons.temperatureQuarter,['temperatureThreeQuarters']:FontAwesomeIcons.temperatureThreeQuarters,['tencentWeibo']:FontAwesomeIcons.tencentWeibo,['tengeSign']:FontAwesomeIcons.tengeSign,['tent']:FontAwesomeIcons.tent,['tentArrowDownToLine']:FontAwesomeIcons.tentArrowDownToLine,['tentArrowLeftRight']:FontAwesomeIcons.tentArrowLeftRight,['tentArrowTurnLeft']:FontAwesomeIcons.tentArrowTurnLeft,['tentArrowsDown']:FontAwesomeIcons.tentArrowsDown,['tents']:FontAwesomeIcons.tents,['terminal']:FontAwesomeIcons.terminal,['textHeight']:FontAwesomeIcons.textHeight,['textSlash']:FontAwesomeIcons.textSlash,['textWidth']:FontAwesomeIcons.textWidth,['theRedYeti']:FontAwesomeIcons.theRedYeti,['themeco']:FontAwesomeIcons.themeco,['themeisle']:FontAwesomeIcons.themeisle,['thermometer']:FontAwesomeIcons.thermometer,['thinkPeaks']:FontAwesomeIcons.thinkPeaks,['solidThumbsDown']:FontAwesomeIcons.solidThumbsDown,['thumbsDown']:FontAwesomeIcons.thumbsDown,['solidThumbsUp']:FontAwesomeIcons.solidThumbsUp,['thumbsUp']:FontAwesomeIcons.thumbsUp,['thumbtack']:FontAwesomeIcons.thumbtack,['ticket']:FontAwesomeIcons.ticket,['ticketSimple']:FontAwesomeIcons.ticketSimple,['tiktok']:FontAwesomeIcons.tiktok,['timeline']:FontAwesomeIcons.timeline,['toggleOff']:FontAwesomeIcons.toggleOff,['toggleOn']:FontAwesomeIcons.toggleOn,['toilet']:FontAwesomeIcons.toilet,['toiletPaper']:FontAwesomeIcons.toiletPaper,['toiletPaperSlash']:FontAwesomeIcons.toiletPaperSlash,['toiletPortable']:FontAwesomeIcons.toiletPortable,['toiletsPortable']:FontAwesomeIcons.toiletsPortable,['toolbox']:FontAwesomeIcons.toolbox,['tooth']:FontAwesomeIcons.tooth,['toriiGate']:FontAwesomeIcons.toriiGate,['tornado']:FontAwesomeIcons.tornado,['towerBroadcast']:FontAwesomeIcons.towerBroadcast,['towerCell']:FontAwesomeIcons.towerCell,['towerObservation']:FontAwesomeIcons.towerObservation,['tractor']:FontAwesomeIcons.tractor,['tradeFederation']:FontAwesomeIcons.tradeFederation,['trademark']:FontAwesomeIcons.trademark,['trafficLight']:FontAwesomeIcons.trafficLight,['trailer']:FontAwesomeIcons.trailer,['train']:FontAwesomeIcons.train,['trainSubway']:FontAwesomeIcons.trainSubway,['trainTram']:FontAwesomeIcons.trainTram,['transgender']:FontAwesomeIcons.transgender,['trash']:FontAwesomeIcons.trash,['trashArrowUp']:FontAwesomeIcons.trashArrowUp,['solidTrashCan']:FontAwesomeIcons.solidTrashCan,['trashCan']:FontAwesomeIcons.trashCan,['trashCanArrowUp']:FontAwesomeIcons.trashCanArrowUp,['tree']:FontAwesomeIcons.tree,['treeCity']:FontAwesomeIcons.treeCity,['trello']:FontAwesomeIcons.trello,['triangleExclamation']:FontAwesomeIcons.triangleExclamation,['trophy']:FontAwesomeIcons.trophy,['trowel']:FontAwesomeIcons.trowel,['trowelBricks']:FontAwesomeIcons.trowelBricks,['truck']:FontAwesomeIcons.truck,['truckArrowRight']:FontAwesomeIcons.truckArrowRight,['truckDroplet']:FontAwesomeIcons.truckDroplet,['truckFast']:FontAwesomeIcons.truckFast,['truckField']:FontAwesomeIcons.truckField,['truckFieldUn']:FontAwesomeIcons.truckFieldUn,['truckFront']:FontAwesomeIcons.truckFront,['truckMedical']:FontAwesomeIcons.truckMedical,['truckMonster']:FontAwesomeIcons.truckMonster,['truckMoving']:FontAwesomeIcons.truckMoving,['truckPickup']:FontAwesomeIcons.truckPickup,['truckPlane']:FontAwesomeIcons.truckPlane,['truckRampBox']:FontAwesomeIcons.truckRampBox,['tty']:FontAwesomeIcons.tty,['tumblr']:FontAwesomeIcons.tumblr,['turkishLiraSign']:FontAwesomeIcons.turkishLiraSign,['turnDown']:FontAwesomeIcons.turnDown,['turnUp']:FontAwesomeIcons.turnUp,['tv']:FontAwesomeIcons.tv,['twitch']:FontAwesomeIcons.twitch,['twitter']:FontAwesomeIcons.twitter,['typo3']:FontAwesomeIcons.typo3,['u']:FontAwesomeIcons.u,['uber']:FontAwesomeIcons.uber,['ubuntu']:FontAwesomeIcons.ubuntu,['uikit']:FontAwesomeIcons.uikit,['umbraco']:FontAwesomeIcons.umbraco,['umbrella']:FontAwesomeIcons.umbrella,['umbrellaBeach']:FontAwesomeIcons.umbrellaBeach,['uncharted']:FontAwesomeIcons.uncharted,['underline']:FontAwesomeIcons.underline,['uniregistry']:FontAwesomeIcons.uniregistry,['unity']:FontAwesomeIcons.unity,['universalAccess']:FontAwesomeIcons.universalAccess,['unlock']:FontAwesomeIcons.unlock,['unlockKeyhole']:FontAwesomeIcons.unlockKeyhole,['unsplash']:FontAwesomeIcons.unsplash,['untappd']:FontAwesomeIcons.untappd,['upDown']:FontAwesomeIcons.upDown,['upDownLeftRight']:FontAwesomeIcons.upDownLeftRight,['upLong']:FontAwesomeIcons.upLong,['upRightAndDownLeftFromCenter']:FontAwesomeIcons.upRightAndDownLeftFromCenter,['upRightFromSquare']:FontAwesomeIcons.upRightFromSquare,['upload']:FontAwesomeIcons.upload,['ups']:FontAwesomeIcons.ups,['usb']:FontAwesomeIcons.usb,['solidUser']:FontAwesomeIcons.solidUser,['user']:FontAwesomeIcons.user,['userAstronaut']:FontAwesomeIcons.userAstronaut,['userCheck']:FontAwesomeIcons.userCheck,['userClock']:FontAwesomeIcons.userClock,['userDoctor']:FontAwesomeIcons.userDoctor,['userGear']:FontAwesomeIcons.userGear,['userGraduate']:FontAwesomeIcons.userGraduate,['userGroup']:FontAwesomeIcons.userGroup,['userInjured']:FontAwesomeIcons.userInjured,['userLarge']:FontAwesomeIcons.userLarge,['userLargeSlash']:FontAwesomeIcons.userLargeSlash,['userLock']:FontAwesomeIcons.userLock,['userMinus']:FontAwesomeIcons.userMinus,['userNinja']:FontAwesomeIcons.userNinja,['userNurse']:FontAwesomeIcons.userNurse,['userPen']:FontAwesomeIcons.userPen,['userPlus']:FontAwesomeIcons.userPlus,['userSecret']:FontAwesomeIcons.userSecret,['userShield']:FontAwesomeIcons.userShield,['userSlash']:FontAwesomeIcons.userSlash,['userTag']:FontAwesomeIcons.userTag,['userTie']:FontAwesomeIcons.userTie,['userXmark']:FontAwesomeIcons.userXmark,['users']:FontAwesomeIcons.users,['usersBetweenLines']:FontAwesomeIcons.usersBetweenLines,['usersGear']:FontAwesomeIcons.usersGear,['usersLine']:FontAwesomeIcons.usersLine,['usersRays']:FontAwesomeIcons.usersRays,['usersRectangle']:FontAwesomeIcons.usersRectangle,['usersSlash']:FontAwesomeIcons.usersSlash,['usersViewfinder']:FontAwesomeIcons.usersViewfinder,['usps']:FontAwesomeIcons.usps,['ussunnah']:FontAwesomeIcons.ussunnah,['utensils']:FontAwesomeIcons.utensils,['v']:FontAwesomeIcons.v,['vaadin']:FontAwesomeIcons.vaadin,['vanShuttle']:FontAwesomeIcons.vanShuttle,['vault']:FontAwesomeIcons.vault,['vectorSquare']:FontAwesomeIcons.vectorSquare,['venus']:FontAwesomeIcons.venus,['venusDouble']:FontAwesomeIcons.venusDouble,['venusMars']:FontAwesomeIcons.venusMars,['vest']:FontAwesomeIcons.vest,['vestPatches']:FontAwesomeIcons.vestPatches,['viacoin']:FontAwesomeIcons.viacoin,['viadeo']:FontAwesomeIcons.viadeo,['vial']:FontAwesomeIcons.vial,['vialCircleCheck']:FontAwesomeIcons.vialCircleCheck,['vialVirus']:FontAwesomeIcons.vialVirus,['vials']:FontAwesomeIcons.vials,['viber']:FontAwesomeIcons.viber,['video']:FontAwesomeIcons.video,['videoSlash']:FontAwesomeIcons.videoSlash,['vihara']:FontAwesomeIcons.vihara,['vimeo']:FontAwesomeIcons.vimeo,['vimeoV']:FontAwesomeIcons.vimeoV,['vine']:FontAwesomeIcons.vine,['virus']:FontAwesomeIcons.virus,['virusCovid']:FontAwesomeIcons.virusCovid,['virusCovidSlash']:FontAwesomeIcons.virusCovidSlash,['virusSlash']:FontAwesomeIcons.virusSlash,['viruses']:FontAwesomeIcons.viruses,['vk']:FontAwesomeIcons.vk,['vnv']:FontAwesomeIcons.vnv,['voicemail']:FontAwesomeIcons.voicemail,['volcano']:FontAwesomeIcons.volcano,['volleyball']:FontAwesomeIcons.volleyball,['volumeHigh']:FontAwesomeIcons.volumeHigh,['volumeLow']:FontAwesomeIcons.volumeLow,['volumeOff']:FontAwesomeIcons.volumeOff,['volumeXmark']:FontAwesomeIcons.volumeXmark,['vrCardboard']:FontAwesomeIcons.vrCardboard,['vuejs']:FontAwesomeIcons.vuejs,['w']:FontAwesomeIcons.w,['walkieTalkie']:FontAwesomeIcons.walkieTalkie,['wallet']:FontAwesomeIcons.wallet,['wandMagic']:FontAwesomeIcons.wandMagic,['wandMagicSparkles']:FontAwesomeIcons.wandMagicSparkles,['wandSparkles']:FontAwesomeIcons.wandSparkles,['warehouse']:FontAwesomeIcons.warehouse,['watchmanMonitoring']:FontAwesomeIcons.watchmanMonitoring,['water']:FontAwesomeIcons.water,['waterLadder']:FontAwesomeIcons.waterLadder,['waveSquare']:FontAwesomeIcons.waveSquare,['waze']:FontAwesomeIcons.waze,['weebly']:FontAwesomeIcons.weebly,['weibo']:FontAwesomeIcons.weibo,['weightHanging']:FontAwesomeIcons.weightHanging,['weightScale']:FontAwesomeIcons.weightScale,['weixin']:FontAwesomeIcons.weixin,['whatsapp']:FontAwesomeIcons.whatsapp,['wheatAwn']:FontAwesomeIcons.wheatAwn,['wheatAwnCircleExclamation']:FontAwesomeIcons.wheatAwnCircleExclamation,['wheelchair']:FontAwesomeIcons.wheelchair,['wheelchairMove']:FontAwesomeIcons.wheelchairMove,['whiskeyGlass']:FontAwesomeIcons.whiskeyGlass,['whmcs']:FontAwesomeIcons.whmcs,['wifi']:FontAwesomeIcons.wifi,['wikipediaW']:FontAwesomeIcons.wikipediaW,['wind']:FontAwesomeIcons.wind,['solidWindowMaximize']:FontAwesomeIcons.solidWindowMaximize,['windowMaximize']:FontAwesomeIcons.windowMaximize,['solidWindowMinimize']:FontAwesomeIcons.solidWindowMinimize,['windowMinimize']:FontAwesomeIcons.windowMinimize,['solidWindowRestore']:FontAwesomeIcons.solidWindowRestore,['windowRestore']:FontAwesomeIcons.windowRestore,['windows']:FontAwesomeIcons.windows,['wineBottle']:FontAwesomeIcons.wineBottle,['wineGlass']:FontAwesomeIcons.wineGlass,['wineGlassEmpty']:FontAwesomeIcons.wineGlassEmpty,['wirsindhandwerk']:FontAwesomeIcons.wirsindhandwerk,['wix']:FontAwesomeIcons.wix,['wizardsOfTheCoast']:FontAwesomeIcons.wizardsOfTheCoast,['wodu']:FontAwesomeIcons.wodu,['wolfPackBattalion']:FontAwesomeIcons.wolfPackBattalion,['wonSign']:FontAwesomeIcons.wonSign,['wordpress']:FontAwesomeIcons.wordpress,['wordpressSimple']:FontAwesomeIcons.wordpressSimple,['worm']:FontAwesomeIcons.worm,['wpbeginner']:FontAwesomeIcons.wpbeginner,['wpexplorer']:FontAwesomeIcons.wpexplorer,['wpforms']:FontAwesomeIcons.wpforms,['wpressr']:FontAwesomeIcons.wpressr,['wrench']:FontAwesomeIcons.wrench,['x']:FontAwesomeIcons.x,['xRay']:FontAwesomeIcons.xRay,['xbox']:FontAwesomeIcons.xbox,['xing']:FontAwesomeIcons.xing,['xmark']:FontAwesomeIcons.xmark,['xmarksLines']:FontAwesomeIcons.xmarksLines,['y']:FontAwesomeIcons.y,['yCombinator']:FontAwesomeIcons.yCombinator,['yahoo']:FontAwesomeIcons.yahoo,['yammer']:FontAwesomeIcons.yammer,['yandex']:FontAwesomeIcons.yandex,['yandexInternational']:FontAwesomeIcons.yandexInternational,['yarn']:FontAwesomeIcons.yarn,['yelp']:FontAwesomeIcons.yelp,['yenSign']:FontAwesomeIcons.yenSign,['yinYang']:FontAwesomeIcons.yinYang,['yoast']:FontAwesomeIcons.yoast,['youtube']:FontAwesomeIcons.youtube,['z']:FontAwesomeIcons.z,['zhihu']:FontAwesomeIcons.zhihu,}),['FaIcon']:(props)=>FaIcon(props.__op_idx__('pa').__op_idx__(0),{key:props.__op_idx__('key'),size:props.__op_idx__('size').toDouble(),color:props.__op_idx__('color'),semanticLabel:props.__op_idx__('semanticLabel'),textDirection:props.__op_idx__('textDirection')}),['FairBindingWidget']:(props)=>FairBindingWidget({key:props.__op_idx__('key')}),['AppTheme']:convertObjectLiteralToSetOrMap({['notWhite']:AppTheme.notWhite,['nearlyWhite']:AppTheme.nearlyWhite,['white']:AppTheme.white,['nearlyBlack']:AppTheme.nearlyBlack,['grey']:AppTheme.grey,['dark_grey']:AppTheme.dark_grey,['darkText']:AppTheme.darkText,['darkerText']:AppTheme.darkerText,['lightText']:AppTheme.lightText,['deactivatedText']:AppTheme.deactivatedText,['dismissibleBackground']:AppTheme.dismissibleBackground,['chipBackground']:AppTheme.chipBackground,['spacer']:AppTheme.spacer,['fontName']:AppTheme.fontName,['textTheme']:AppTheme.textTheme,['display1']:AppTheme.display1,['headline']:AppTheme.headline,['title']:AppTheme.title,['subtitle']:AppTheme.subtitle,['body2']:AppTheme.body2,['body1']:AppTheme.body1,['caption']:AppTheme.caption,['greyWithOpacity']:AppTheme.greyWithOpacity,}),['ComposerWidget']:(props)=>ComposerWidget(),['BestUiPage']:(props)=>BestUiPage({key:props.__op_idx__('key')}),['HotelAppTheme.buildLightTheme']:(props)=>HotelAppTheme.buildLightTheme(),['SmoothStarRating']:(props)=>SmoothStarRating({starCount:props.__op_idx__('starCount')??5,spacing:props.__op_idx__('spacing').toDouble()??0.0,rating:props.__op_idx__('rating').toDouble()??0.0,defaultIconData:props.__op_idx__('defaultIconData'),onRatingChanged:props.__op_idx__('onRatingChanged'),color:props.__op_idx__('color'),borderColor:props.__op_idx__('borderColor'),size:props.__op_idx__('size').toDouble()??25,filledIconData:props.__op_idx__('filledIconData'),halfFilledIconData:props.__op_idx__('halfFilledIconData'),allowHalfRating:props.__op_idx__('allowHalfRating')??true}),['MasonryGridView']:(props)=>MasonryGridView({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),children:as(props.__op_idx__('children'))??[],semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId')}),['MasonryGridView.builder']:(props)=>MasonryGridView.builder({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.custom']:(props)=>MasonryGridView.custom({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),gridDelegate:props.__op_idx__('gridDelegate'),childrenDelegate:props.__op_idx__('childrenDelegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.count']:(props)=>MasonryGridView.count({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),crossAxisCount:props.__op_idx__('crossAxisCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['MasonryGridView.extent']:(props)=>MasonryGridView.extent({key:props.__op_idx__('key'),scrollDirection:props.__op_idx__('scrollDirection')??Axis.vertical,reverse:props.__op_idx__('reverse')??false,controller:props.__op_idx__('controller'),primary:props.__op_idx__('primary'),physics:props.__op_idx__('physics'),shrinkWrap:props.__op_idx__('shrinkWrap')??false,padding:props.__op_idx__('padding'),maxCrossAxisExtent:props.__op_idx__('maxCrossAxisExtent').toDouble()??0,mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0.0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0.0,itemBuilder:props.__op_idx__('itemBuilder'),itemCount:props.__op_idx__('itemCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,cacheExtent:props.__op_idx__('cacheExtent').toDouble(),semanticChildCount:props.__op_idx__('semanticChildCount'),dragStartBehavior:props.__op_idx__('dragStartBehavior')??DragStartBehavior.start,keyboardDismissBehavior:props.__op_idx__('keyboardDismissBehavior')??ScrollViewKeyboardDismissBehavior.manual,restorationId:props.__op_idx__('restorationId'),clipBehavior:props.__op_idx__('clipBehavior')??Clip.hardEdge}),['StaggeredGrid.custom']:(props)=>StaggeredGrid.custom({key:props.__op_idx__('key'),delegate:props.__op_idx__('delegate'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),['StaggeredGrid.count']:(props)=>StaggeredGrid.count({key:props.__op_idx__('key'),crossAxisCount:props.__op_idx__('crossAxisCount'),mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),['StaggeredGrid.extent']:(props)=>StaggeredGrid.extent({key:props.__op_idx__('key'),maxCrossAxisExtent:props.__op_idx__('maxCrossAxisExtent').toDouble()??0,mainAxisSpacing:props.__op_idx__('mainAxisSpacing').toDouble()??0,crossAxisSpacing:props.__op_idx__('crossAxisSpacing').toDouble()??0,axisDirection:props.__op_idx__('axisDirection'),children:as(props.__op_idx__('children'))??[]}),});}},mapping:function mapping(){const __thiz__=this;with(__thiz__){return const{'FontAwesomeIcons':false,'FaIcon':true,'FairBindingWidget':true,'AppTheme':false,'ComposerWidget':true,'BestUiPage':true,'HotelAppTheme':false,'SmoothStarRating':true,'MasonryGridView':true,'StaggeredGrid':true};}},};AppGeneratedModule.prototype.ctor=function(){GeneratedModule.prototype.ctor.call(this)};inherit(AppGeneratedModule,GeneratedModule);}__mod__.exports.AppGeneratedModule=AppGeneratedModule;},[]);defineModule(1,function(__mod__){with(__mod__.imports){function FairAppModule(){const inner=FairAppModule.__inner__;if(this==__global__){return new FairAppModule({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);FairAppModule.prototype.ctor.apply(this,args);return this;}}FairAppModule.__inner__=function inner(){AppGeneratedModule.__inner__.call(this);};FairAppModule.prototype={components:function components(){const __thiz__=this;with(__thiz__){return(function(){let __target__=;__target__.addAll(convertObjectLiteralToSetOrMap({['SliverChildBuilderDelegate']:(props)=>SliverChildBuilderDelegate(props.__op_idx__('pa').__op_idx__(0),{childCount:props.__op_idx__('childCount'),addAutomaticKeepAlives:props.__op_idx__('addAutomaticKeepAlives')??true,addRepaintBoundaries:props.__op_idx__('addRepaintBoundaries')??true,addSemanticIndexes:props.__op_idx__('addSemanticIndexes')??true,semanticIndexOffset:props.__op_idx__('semanticIndexOffset')??0}),['InputBorder.none']:InputBorder.none,}));return __target__;})();}},};FairAppModule.prototype.ctor=function(){AppGeneratedModule.prototype.ctor.call(this)};inherit(FairAppModule,AppGeneratedModule);}__mod__.exports.FairAppModule=FairAppModule;},[2]);return runCallback(function(__mod__){with(__mod__.imports){function _MyHomePageState(){const inner=_MyHomePageState.__inner__;if(this==__global__){return new _MyHomePageState({__args__:arguments});}else{const args=arguments.length>0?arguments[0].__args__||arguments:[];inner.apply(this,args);_MyHomePageState.prototype.ctor.apply(this,args);return this;}}_MyHomePageState.__inner__=function inner(){this.fairProps=__initProps__;this._counter=0;};_MyHomePageState.prototype={initState:function initState(){const __thiz__=this;with(__thiz__){fairProps=widget.fairProps;}},getTitle:function getTitle(){const __thiz__=this;with(__thiz__){return fairProps.__op_idx__('title');}},_incrementCounter:function _incrementCounter(){const __thiz__=this;with(__thiz__){setState('#FairKey#',function dummy(){_counter++;});}},};_MyHomePageState.prototype.ctor=function(){};;return _MyHomePageState();}},[[1,'g']]);})(convertObjectLiteralToSetOrMap(JSON.parse('#FairProps#'))); \ No newline at end of file diff --git a/example/assets/fair/lib_main.fair.json b/example/assets/fair/lib_main.fair.json index ea7e8dd1..4ca22a53 100644 --- a/example/assets/fair/lib_main.fair.json +++ b/example/assets/fair/lib_main.fair.json @@ -66,6 +66,5 @@ } } }, - "methodMap": {}, - "digest": "a5b1303b82b3f77de8e67850400b9c1e" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_main.fair.metadata b/example/assets/fair/lib_main.fair.metadata index ff20150a..a2f4f78f 100644 --- a/example/assets/fair/lib_main.fair.metadata +++ b/example/assets/fair/lib_main.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.126396. +# Generated by Fair on 2024-01-03 19:50:38.751387. source: example|lib/main.dart -md5: c037c1cc5521a6558ebf16935f7d728c +md5: c68d158f9f232ce868ca772b68f4e864 json: example|build/fair/lib_main.fair.json -date: 2023-10-31 10:53:29.126442 +bin: example|build/fair/lib_main.fair.bin +date: 2024-01-03 19:50:38.751548 diff --git a/example/assets/fair/lib_page2page_page_one.fair.json b/example/assets/fair/lib_page2page_page_one.fair.json index 4efde62c..b29fc30e 100644 --- a/example/assets/fair/lib_page2page_page_one.fair.json +++ b/example/assets/fair/lib_page2page_page_one.fair.json @@ -62,6 +62,5 @@ } } }, - "methodMap": {}, - "digest": "9790d0d1bfec1cf55952ccc682614fa2" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_page2page_page_one.fair.metadata b/example/assets/fair/lib_page2page_page_one.fair.metadata index 0a02da25..38d1678f 100644 --- a/example/assets/fair/lib_page2page_page_one.fair.metadata +++ b/example/assets/fair/lib_page2page_page_one.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.109990. +# Generated by Fair on 2024-01-03 19:50:39.011834. source: example|lib/page2page/page_one.dart -md5: 0e2b8fdbfdc55e2469870cb9462b403c +md5: 5e0a2134e417468d4318f8c8242b2e3e json: example|build/fair/lib_page2page_page_one.fair.json -date: 2023-10-31 10:53:29.110033 +bin: example|build/fair/lib_page2page_page_one.fair.bin +date: 2024-01-03 19:50:39.012024 diff --git a/example/assets/fair/lib_page2page_page_two.fair.json b/example/assets/fair/lib_page2page_page_two.fair.json index 9207c072..fef786fd 100644 --- a/example/assets/fair/lib_page2page_page_two.fair.json +++ b/example/assets/fair/lib_page2page_page_two.fair.json @@ -35,6 +35,5 @@ } } }, - "methodMap": {}, - "digest": "94973711a4be97191459e77c105a6441" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_page2page_page_two.fair.metadata b/example/assets/fair/lib_page2page_page_two.fair.metadata index 08bc70b9..1bb9e481 100644 --- a/example/assets/fair/lib_page2page_page_two.fair.metadata +++ b/example/assets/fair/lib_page2page_page_two.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.064704. +# Generated by Fair on 2024-01-03 19:50:39.068510. source: example|lib/page2page/page_two.dart -md5: 363e74697451248cf0f2fc2376a6f3a7 +md5: 667130ca0c77da994c29aecd3bebf0bb json: example|build/fair/lib_page2page_page_two.fair.json -date: 2023-10-31 10:53:29.064752 +bin: example|build/fair/lib_page2page_page_two.fair.bin +date: 2024-01-03 19:50:39.068682 diff --git a/example/assets/fair/lib_template_appbar_appbar_template.fair.json b/example/assets/fair/lib_template_appbar_appbar_template.fair.json index cc059936..9a24fa85 100644 --- a/example/assets/fair/lib_template_appbar_appbar_template.fair.json +++ b/example/assets/fair/lib_template_appbar_appbar_template.fair.json @@ -22,6 +22,5 @@ } } }, - "methodMap": {}, - "digest": "e593158025d5b81cf30acb5bf41410ac" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_appbar_appbar_template.fair.metadata b/example/assets/fair/lib_template_appbar_appbar_template.fair.metadata index 3b436c8e..a5c53072 100644 --- a/example/assets/fair/lib_template_appbar_appbar_template.fair.metadata +++ b/example/assets/fair/lib_template_appbar_appbar_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.963318. +# Generated by Fair on 2024-01-03 19:50:38.881584. source: example|lib/template/appbar/appbar_template.dart -md5: 1d724f88d4e38df16b49eb3d05a3df01 +md5: e5f4cb764283d409724ea14fe006ecf2 json: example|build/fair/lib_template_appbar_appbar_template.fair.json -date: 2023-10-31 10:53:28.963369 +bin: example|build/fair/lib_template_appbar_appbar_template.fair.bin +date: 2024-01-03 19:50:38.881737 diff --git a/example/assets/fair/lib_template_detail_page_fair_detail.fair.json b/example/assets/fair/lib_template_detail_page_fair_detail.fair.json index e2e9b366..07356bc3 100644 --- a/example/assets/fair/lib_template_detail_page_fair_detail.fair.json +++ b/example/assets/fair/lib_template_detail_page_fair_detail.fair.json @@ -373,6 +373,5 @@ } } } - }, - "digest": "0bc5998caa5d7d3837a692bd5947b1f3" + } } \ No newline at end of file diff --git a/example/assets/fair/lib_template_detail_page_fair_detail.fair.metadata b/example/assets/fair/lib_template_detail_page_fair_detail.fair.metadata index b68ebf48..973b4904 100644 --- a/example/assets/fair/lib_template_detail_page_fair_detail.fair.metadata +++ b/example/assets/fair/lib_template_detail_page_fair_detail.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.002185. +# Generated by Fair on 2024-01-03 19:50:38.424247. source: example|lib/template/detail_page/fair_detail.dart -md5: 97e0d468098c76fdd996408a4aecc553 +md5: 285ee91c30d7e5f110a846775136a0c9 json: example|build/fair/lib_template_detail_page_fair_detail.fair.json -date: 2023-10-31 10:53:29.002332 +bin: example|build/fair/lib_template_detail_page_fair_detail.fair.bin +date: 2024-01-03 19:50:38.424452 diff --git a/example/assets/fair/lib_template_drawer_drawer_template.fair.json b/example/assets/fair/lib_template_drawer_drawer_template.fair.json index 1665bc5e..8a549915 100644 --- a/example/assets/fair/lib_template_drawer_drawer_template.fair.json +++ b/example/assets/fair/lib_template_drawer_drawer_template.fair.json @@ -127,6 +127,5 @@ } } }, - "methodMap": {}, - "digest": "03e886825ea89c448eab05f2c0f28bec" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_drawer_drawer_template.fair.metadata b/example/assets/fair/lib_template_drawer_drawer_template.fair.metadata index 409c831d..640b24f7 100644 --- a/example/assets/fair/lib_template_drawer_drawer_template.fair.metadata +++ b/example/assets/fair/lib_template_drawer_drawer_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.014322. +# Generated by Fair on 2024-01-03 19:50:37.671528. source: example|lib/template/drawer/drawer_template.dart -md5: aee48024646cf7db87015165b2a08eec +md5: 368e50aa99209d6277ff3563a01d7e83 json: example|build/fair/lib_template_drawer_drawer_template.fair.json -date: 2023-10-31 10:53:29.014382 +bin: example|build/fair/lib_template_drawer_drawer_template.fair.bin +date: 2024-01-03 19:50:37.671762 diff --git a/example/assets/fair/lib_template_fab_fab_template.fair.json b/example/assets/fair/lib_template_fab_fab_template.fair.json index 683ce3b7..b55d80a9 100644 --- a/example/assets/fair/lib_template_fab_fab_template.fair.json +++ b/example/assets/fair/lib_template_fab_fab_template.fair.json @@ -60,6 +60,5 @@ } } }, - "methodMap": {}, - "digest": "55d7a801f77713bfdcb425941680e578" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_fab_fab_template.fair.metadata b/example/assets/fair/lib_template_fab_fab_template.fair.metadata index 43ba157a..cd9c3b17 100644 --- a/example/assets/fair/lib_template_fab_fab_template.fair.metadata +++ b/example/assets/fair/lib_template_fab_fab_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.048878. +# Generated by Fair on 2024-01-03 19:50:38.059674. source: example|lib/template/fab/fab_template.dart -md5: 57ab6cf1b86a8344d7cf1f1ae23ab3df +md5: a72c9aa6fd5b9ddf77c6bc02008a85b9 json: example|build/fair/lib_template_fab_fab_template.fair.json -date: 2023-10-31 10:53:29.048923 +bin: example|build/fair/lib_template_fab_fab_template.fair.bin +date: 2024-01-03 19:50:38.059889 diff --git a/example/assets/fair/lib_template_gridview_gridview_template.fair.json b/example/assets/fair/lib_template_gridview_gridview_template.fair.json index 8ef8b71e..7beaaf6c 100644 --- a/example/assets/fair/lib_template_gridview_gridview_template.fair.json +++ b/example/assets/fair/lib_template_gridview_gridview_template.fair.json @@ -96,6 +96,5 @@ } } }, - "methodMap": {}, - "digest": "6f1ea339ab8d0d694ca0b23830d0d985" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_gridview_gridview_template.fair.metadata b/example/assets/fair/lib_template_gridview_gridview_template.fair.metadata index 73aa2105..67d24f71 100644 --- a/example/assets/fair/lib_template_gridview_gridview_template.fair.metadata +++ b/example/assets/fair/lib_template_gridview_gridview_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.034486. +# Generated by Fair on 2024-01-03 19:50:37.938256. source: example|lib/template/gridview/gridview_template.dart -md5: 0482a165d1d7f83f0570be4a17d8a1a7 +md5: d727c9c4bd6be68dc68346e35e4ee449 json: example|build/fair/lib_template_gridview_gridview_template.fair.json -date: 2023-10-31 10:53:29.034552 +bin: example|build/fair/lib_template_gridview_gridview_template.fair.bin +date: 2024-01-03 19:50:37.938611 diff --git a/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.json b/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.json index 6208d98a..e3e0546c 100644 --- a/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.json +++ b/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.json @@ -393,6 +393,5 @@ } } }, - "methodMap": {}, - "digest": "6b43e206c7278aeb886971eaf4ccddad" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.metadata b/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.metadata index 779eaf60..32b7c603 100644 --- a/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.metadata +++ b/example/assets/fair/lib_template_hotel_listview_hotel_listview_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.008348. +# Generated by Fair on 2024-01-03 19:50:38.114845. source: example|lib/template/hotel_listview/hotel_listview_template.dart -md5: 5873c564f6d51d95d9a5d0b54e92107c +md5: 68fd069524eeb945d2e819979b5abc43 json: example|build/fair/lib_template_hotel_listview_hotel_listview_template.fair.json -date: 2023-10-31 10:53:29.008620 +bin: example|build/fair/lib_template_hotel_listview_hotel_listview_template.fair.bin +date: 2024-01-03 19:50:38.115187 diff --git a/example/assets/fair/lib_template_list_card_moments_list.fair.json b/example/assets/fair/lib_template_list_card_moments_list.fair.json index d7694dc8..7bdcf386 100644 --- a/example/assets/fair/lib_template_list_card_moments_list.fair.json +++ b/example/assets/fair/lib_template_list_card_moments_list.fair.json @@ -412,6 +412,5 @@ } } }, - "methodMap": {}, - "digest": "3418c99d7ba6b178297eb50fb87ba33f" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_list_card_moments_list.fair.metadata b/example/assets/fair/lib_template_list_card_moments_list.fair.metadata index 2e5291c3..c07ab037 100644 --- a/example/assets/fair/lib_template_list_card_moments_list.fair.metadata +++ b/example/assets/fair/lib_template_list_card_moments_list.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.020153. +# Generated by Fair on 2024-01-03 19:50:38.246671. source: example|lib/template/list_card/moments_list.dart -md5: f2c2499d36aed30a722023cff6c47ef0 +md5: 11acb19a2c079c00362ac741fa43b66a json: example|build/fair/lib_template_list_card_moments_list.fair.json -date: 2023-10-31 10:53:29.020315 +bin: example|build/fair/lib_template_list_card_moments_list.fair.bin +date: 2024-01-03 19:50:38.246975 diff --git a/example/assets/fair/lib_template_list_page_list_page.fair.json b/example/assets/fair/lib_template_list_page_list_page.fair.json index 718c5a4b..69a7938a 100644 --- a/example/assets/fair/lib_template_list_page_list_page.fair.json +++ b/example/assets/fair/lib_template_list_page_list_page.fair.json @@ -376,6 +376,5 @@ } } }, - "methodMap": {}, - "digest": "8fbbc144778cb7f28abf5d3d9d64884d" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_list_page_list_page.fair.metadata b/example/assets/fair/lib_template_list_page_list_page.fair.metadata index 2e6112f6..0392b717 100644 --- a/example/assets/fair/lib_template_list_page_list_page.fair.metadata +++ b/example/assets/fair/lib_template_list_page_list_page.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.917829. +# Generated by Fair on 2024-01-03 19:50:38.478413. source: example|lib/template/list_page/list_page.dart -md5: f34574ab07b66dd5725a41992a89d204 +md5: 7b16b1ed973e29324205918de191e0b3 json: example|build/fair/lib_template_list_page_list_page.fair.json -date: 2023-10-31 10:53:28.918109 +bin: example|build/fair/lib_template_list_page_list_page.fair.bin +date: 2024-01-03 19:50:38.478706 diff --git a/example/assets/fair/lib_template_login_page_login_page_template.fair.json b/example/assets/fair/lib_template_login_page_login_page_template.fair.json index 10bc0271..78c37a18 100644 --- a/example/assets/fair/lib_template_login_page_login_page_template.fair.json +++ b/example/assets/fair/lib_template_login_page_login_page_template.fair.json @@ -407,6 +407,5 @@ } } }, - "methodMap": {}, - "digest": "f2c85d52b23a0eabb64270f733fc2031" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_login_page_login_page_template.fair.metadata b/example/assets/fair/lib_template_login_page_login_page_template.fair.metadata index 1ed9534d..9a2cc04a 100644 --- a/example/assets/fair/lib_template_login_page_login_page_template.fair.metadata +++ b/example/assets/fair/lib_template_login_page_login_page_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.979297. +# Generated by Fair on 2024-01-03 19:50:38.665441. source: example|lib/template/login_page/login_page_template.dart -md5: e47453b83f6abdcb5245d019dd46e1a3 +md5: 0882c627c824caaa6b58a0db8b706633 json: example|build/fair/lib_template_login_page_login_page_template.fair.json -date: 2023-10-31 10:53:28.979422 +bin: example|build/fair/lib_template_login_page_login_page_template.fair.bin +date: 2024-01-03 19:50:38.665687 diff --git a/example/assets/fair/lib_template_pageview_pageview_template.fair.json b/example/assets/fair/lib_template_pageview_pageview_template.fair.json index 418d1ea7..58a2ac3f 100644 --- a/example/assets/fair/lib_template_pageview_pageview_template.fair.json +++ b/example/assets/fair/lib_template_pageview_pageview_template.fair.json @@ -94,6 +94,5 @@ } } }, - "methodMap": {}, - "digest": "0b0bf71fe0cfaca9b35a3fde6e4395d0" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_pageview_pageview_template.fair.metadata b/example/assets/fair/lib_template_pageview_pageview_template.fair.metadata index d0bb4160..9bb0500f 100644 --- a/example/assets/fair/lib_template_pageview_pageview_template.fair.metadata +++ b/example/assets/fair/lib_template_pageview_pageview_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.954289. +# Generated by Fair on 2024-01-03 19:50:38.168153. source: example|lib/template/pageview/pageview_template.dart -md5: 0981e1392a9db2a5905ec353e3543dee +md5: 7164e05f6d2fbc769e01856005095b59 json: example|build/fair/lib_template_pageview_pageview_template.fair.json -date: 2023-10-31 10:53:28.954371 +bin: example|build/fair/lib_template_pageview_pageview_template.fair.bin +date: 2024-01-03 19:50:38.168352 diff --git a/example/assets/fair/lib_template_scrollview_home_scrollview.fair.json b/example/assets/fair/lib_template_scrollview_home_scrollview.fair.json index 6f5582ad..e66ffc97 100644 --- a/example/assets/fair/lib_template_scrollview_home_scrollview.fair.json +++ b/example/assets/fair/lib_template_scrollview_home_scrollview.fair.json @@ -182,6 +182,5 @@ } } }, - "methodMap": {}, - "digest": "4f7eca921157c454b5a28081a774591f" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_scrollview_home_scrollview.fair.metadata b/example/assets/fair/lib_template_scrollview_home_scrollview.fair.metadata index 095847f3..2459a31a 100644 --- a/example/assets/fair/lib_template_scrollview_home_scrollview.fair.metadata +++ b/example/assets/fair/lib_template_scrollview_home_scrollview.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:28.974533. +# Generated by Fair on 2024-01-03 19:50:38.297693. source: example|lib/template/scrollview/home_scrollview.dart -md5: 6e08725a87bdf1c138fd345cb006dc3b +md5: 4db47da4ee8a240bdf1b606e86df6851 json: example|build/fair/lib_template_scrollview_home_scrollview.fair.json -date: 2023-10-31 10:53:28.974630 +bin: example|build/fair/lib_template_scrollview_home_scrollview.fair.bin +date: 2024-01-03 19:50:38.297900 diff --git a/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.json b/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.json index f790f9c7..8549b173 100644 --- a/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.json +++ b/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.json @@ -96,6 +96,5 @@ } } }, - "methodMap": {}, - "digest": "75b754292aa49a79c018cf1d50182d3f" + "methodMap": {} } \ No newline at end of file diff --git a/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.metadata b/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.metadata index 7e3a8a95..1ab39efc 100644 --- a/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.metadata +++ b/example/assets/fair/lib_template_staggered_view_staggeredview_template.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.027896. +# Generated by Fair on 2024-01-03 19:50:39.121226. source: example|lib/template/staggered_view/staggeredview_template.dart -md5: f59a16b1989afd0d5f89adb07c398391 +md5: 3a84e5df7070be0b51bc3e0404d4aa12 json: example|build/fair/lib_template_staggered_view_staggeredview_template.fair.json -date: 2023-10-31 10:53:29.027954 +bin: example|build/fair/lib_template_staggered_view_staggeredview_template.fair.bin +date: 2024-01-03 19:50:39.121393 diff --git a/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.json b/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.json index 4148bcf4..257f42e6 100644 --- a/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.json +++ b/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.json @@ -448,6 +448,5 @@ } } } - }, - "digest": "68ea4fd2cb78969cffec5ba319f5254c" + } } \ No newline at end of file diff --git a/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.metadata b/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.metadata index b7cb5d08..3a7d53a7 100644 --- a/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.metadata +++ b/example/assets/fair/lib_template_tabbar_page_tabbar_page.fair.metadata @@ -1,6 +1,7 @@ -# Generated by Fair on 2023-10-31 10:53:29.117662. +# Generated by Fair on 2024-01-03 19:50:38.557713. source: example|lib/template/tabbar_page/tabbar_page.dart -md5: ac2ef2acaf7fddd1b36e3da13a6636be +md5: 4fe73f589399637ad5b9fa326b0c29da json: example|build/fair/lib_template_tabbar_page_tabbar_page.fair.json -date: 2023-10-31 10:53:29.117806 +bin: example|build/fair/lib_template_tabbar_page_tabbar_page.fair.bin +date: 2024-01-03 19:50:38.558 diff --git a/example/assets/fair_basic_config.json b/example/assets/fair_basic_config.json index f2b7f0fd..40fd949a 100644 --- a/example/assets/fair_basic_config.json +++ b/example/assets/fair_basic_config.json @@ -1,6 +1,7 @@ { "plugin": { "fair_basic_plugin": "assets/plugin/fair_basic_plugins.js", + "fair_common_plugin": "assets/plugin/fair_common_plugin.js", "fair_net": "assets/plugin/fair_net_plugin.js" } } diff --git a/example/assets/plugin/fair_common_plugin.js b/example/assets/plugin/fair_common_plugin.js new file mode 100644 index 00000000..d10061b6 --- /dev/null +++ b/example/assets/plugin/fair_common_plugin.js @@ -0,0 +1,10 @@ +let FairCommonPlugin = function () { + return { + http: function (resp) { + fairCommonPluginRequest(resp, 'http'); + }, + phoneCall: function (resp) { + fairCommonPluginRequest(resp, 'phoneCall'); + }, + } +} diff --git a/example/lib/fair_widget/fair_plugin_widget.dart b/example/lib/fair_widget/fair_plugin_widget.dart index f2e8262d..f5d2317a 100644 --- a/example/lib/fair_widget/fair_plugin_widget.dart +++ b/example/lib/fair_widget/fair_plugin_widget.dart @@ -1,4 +1,5 @@ import 'package:example/fair_widget/plugin/fair_basic_plugin.dart'; +import 'package:example/fair_widget/plugin/fair_common_plugin.dart'; import 'package:fair/fair.dart'; import 'package:flutter/material.dart'; @@ -19,14 +20,21 @@ class _FairPluginWidgetState extends State { ), body: Container( child: Center( - child: GestureDetector( - onTap: callPhone, - child: Container( - height: 50, - width: 100, - alignment: Alignment.center, - child: Text('拨打电话'), - ), + child: Column( + children: [ + Container( + alignment: Alignment.center, + child: ElevatedButton( + onPressed: callPhone, + child: Text('拨打电话-基于FairBasicPlugin')), + ), + Container( + alignment: Alignment.center, + child: ElevatedButton( + onPressed: commonHttp, + child: Text('网络请求-基于FairCommonPlugin')), + ), + ], ), ), ), @@ -45,4 +53,25 @@ class _FairPluginWidgetState extends State { } }); } -} + + commonHttp() { + FairCommonPlugin().http({ + 'method': 'GET', + 'url': + 'https://wos2.58cdn.com.cn/DeFazYxWvDti/frsupload/3b8ae7a4e0884b4d75b8094f6c83cd8c_list_page_data.json', + 'callback': (dynamic result) { + if (result != null) { + var statusCode = result['statusCode']; + if (statusCode == 200) { + var list = result['data']['data']; + list.forEach((item) { + var icon = item['icon']; + print('icon = $icon'); + }); + } + } + } + }); + } + +} \ No newline at end of file diff --git a/example/lib/fair_widget/plugin/fair_common_plugin.dart b/example/lib/fair_widget/plugin/fair_common_plugin.dart new file mode 100644 index 00000000..3a562dff --- /dev/null +++ b/example/lib/fair_widget/plugin/fair_common_plugin.dart @@ -0,0 +1,19 @@ +import 'package:example/fair_widget/plugin/fair_http_plugin.dart'; +import 'package:fair/fair.dart'; + +/// 跟 js 交互的方法类 +class FairCommonPlugin extends IFairPlugin with FairHttpPlugin //Http请求plugin +{ + factory FairCommonPlugin() => _fairCommonPlugin; + + FairCommonPlugin._(); + + static final FairCommonPlugin _fairCommonPlugin = FairCommonPlugin._(); + + @override + Map getRegisterMethods() { + return { + 'http': http, + }; + } +} diff --git a/example/lib/fair_widget/plugin/fair_http_plugin.dart b/example/lib/fair_widget/plugin/fair_http_plugin.dart new file mode 100644 index 00000000..f78c63b6 --- /dev/null +++ b/example/lib/fair_widget/plugin/fair_http_plugin.dart @@ -0,0 +1,52 @@ +import 'dart:convert'; + +import 'package:dio/dio.dart'; +import 'package:fair/fair.dart'; + +mixin FairHttpPlugin implements FairCommonPluginMixin { + Future http(dynamic map) => request(map, _run); + + Future _run(Map requestMap) async { + // implements http here. + final method = requestMap['method']; + final url = requestMap['url']; + Response? result; + switch (method) { + case 'GET': + result = await _get(url); + break; + case 'POST': + result = await _post(url); + break; + default: + } + if (result != null) { + return { + 'data': result.data == null ? '' : jsonDecode(result.data!), + 'statusCode': result.statusCode, + }; + } + return null; + } + + static Future> _post(String path, + {Map? queryParameters}) async { + var resp = + await _getDio().post(path, queryParameters: queryParameters); + return Future.value(resp); + } + + static Future> _get(String path, + {Map? queryParameters}) async { + var resp = + await _getDio().get(path, queryParameters: queryParameters); + return Future.value(resp); + } + + static Dio? _dio; + + static Dio _getDio() { + _dio ??= Dio(); + return _dio!; + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart index 714b9384..e70f933f 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:example/fair_widget/delegate/test_fair_delegate.dart'; import 'package:example/fair_widget/plugin/fair_basic_plugin.dart'; +import 'package:example/fair_widget/plugin/fair_common_plugin.dart'; import 'package:example/home_page.dart'; import 'package:fair/fair.dart'; import 'package:fair_extension/fair_extension.dart'; @@ -36,9 +37,11 @@ void main() async { ///需要在此注册需要全局使用的plugin,key名可以随意不做要求 plugins: FairExtension.plugins - ..addAll({'FairBasicPlugin': FairBasicPlugin()}), - jsPlugins: FairExtension.jsPlugins - ); + ..addAll({ + 'FairBasicPlugin': FairBasicPlugin(), + 'FairCommonPlugin': FairCommonPlugin(), + }), + jsPlugins: FairExtension.jsPlugins); } class MyApp extends StatelessWidget { diff --git a/fair/assets/fair_core/fair_common_plugin.js b/fair/assets/fair_core/fair_common_plugin.js index 01e01d6a..e10a7974 100644 --- a/fair/assets/fair_core/fair_common_plugin.js +++ b/fair/assets/fair_core/fair_common_plugin.js @@ -7,13 +7,13 @@ let fairCommonPluginRequest = function (resp, methodName) { respMap = mapOrSetToObject(resp); let id = 'FairCommonPlugin$' + (++_callBackId); let requestParameter = {}; + requestParameter['pageName'] = '#FairKey#'; // 类名 + 方法名 requestParameter['className'] = "FairCommonPlugin#" + methodName; _callBack[id] = respMap['callback']; respMap['callId'] = id; // 代码里面有判断 funcName 必填 requestParameter['funcName'] = 'invokePlugin'; - requestParameter['pageName'] = respMap['pageName']; requestParameter['request'] = respMap; let map = JSON.stringify(requestParameter); console.log('FairCommonPlugin请求参数:' + map); diff --git a/fair_extension/README.md b/fair_extension/README.md index e9370e34..c9dc90ef 100644 --- a/fair_extension/README.md +++ b/fair_extension/README.md @@ -1,4 +1,4 @@ -## 背景 +## 简介 关于Fair 的动态化能力支持,涉及到如下几个方面: - 平台相关能力,如打电话、定位、权限申请、相机等 - 业务逻辑相关,路由、埋点等 @@ -7,15 +7,43 @@ 为了避免出现上述问题,我们希望在Fair 接入阶段,就内置常用的业务逻辑。并且我们把通用的业务逻辑以扩展包的形式提供给开发者。开发者在Fair 接入阶段,通过依赖扩展包,经过简单的配置,就可以实现常用业务逻辑的支持。 ## 目前支持 -#### Log -示例: + +* Log +* Toast +* 网络请求 +* 权限申请 +* 图片选择/调用相机 +* url_launcher(电话、短信、邮件、web等) +* 页面跳转 + +## 接入说明 +### 添加fair_extension 依赖 + +``` +fair_extension: 1.0.0 +``` + +### fair_extension 初始化 +fair 初始化中,设置plugins 及 jsPlugins。 + +``` +FairApp.runApplication( + FairApp( + child: const MyApp(), + ), + plugins: FairExtension.plugins, + jsPlugins: FairExtension.jsPlugins); +``` + +### fair_extension 使用 + +#### Log示例: ``` FairLog.log('点击展示 Count Value:: $_count'); ``` -#### Toast -示例: +#### Toast示例: ``` FairToast.show( @@ -24,8 +52,7 @@ FairToast.show( ); ``` -#### 网络请求 -示例: +#### 网络请求示例: ``` FairNet.requestData( @@ -47,8 +74,7 @@ FairNet.requestData( }); ``` -#### 权限申请 -示例: +#### 权限申请示例: ``` FairPermission.requestPermission( @@ -63,8 +89,7 @@ FairPermission.requestPermission( }); ``` -#### 图片选择/调用相机 -示例: +#### 图片选择/调用相机示例: ``` FairImagePicker.getImage( @@ -78,8 +103,7 @@ FairImagePicker.getImage( }); ``` -#### url_launcher(电话、短信、邮件、web等) -示例: +#### url_launcher(电话、短信、邮件、web等)示例: ``` // 打电话 @@ -88,8 +112,7 @@ FairUrlLauncher.makePhoneCall(_phone); FairUrlLauncher.launchInBrowser(_url); ``` -#### 页面跳转 -示例: +#### 页面跳转示例: ``` FairNavigator.pushNamed( @@ -106,26 +129,4 @@ FairNavigator.pushNamed( }); ``` -#### 持续更新中... - -## 接入说明 -#### 添加fair_extension 依赖 - -``` -fair_extension: 1.0.0 -``` - -#### fair_extension 初始化 -fair 初始化中,设置plugins 及 jsPlugins。 - -``` -FairApp.runApplication( - FairApp( - child: const MyApp(), - ), - plugins: FairExtension.plugins, - jsPlugins: FairExtension.jsPlugins); -``` - -#### fair_extension 使用 -详见[example](./example) +#### 持续更新中... \ No newline at end of file From 089206ce1d88366876f2e5300bfb4633fb6d901d Mon Sep 17 00:00:00 2001 From: sunzhe03 Date: Mon, 8 Jan 2024 11:59:34 +0800 Subject: [PATCH 44/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/wechat-group-02.png | Bin 23569 -> 23438 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/wechat-group-02.png b/resources/wechat-group-02.png index 37be83121fd7317d024e6399d4cf84b0d9b4b20c..0524dbad954f99917e35589d869040f40e3f6804 100644 GIT binary patch literal 23438 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 OnB~t0f4Xn#68#?qJIlHN literal 23569 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

2^H87BpJA;esiy6H+rTkAT6x!w6^xy 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